automa 项目开发与构建流程文档
1. 项目概述
automa 是一个基于 Vue.js 构建的浏览器扩展,允许用户通过连接功能块来创建自动化工作流。项目使用 Webpack 进行构建,支持 Chrome 和 Firefox 两种主流浏览器。
2. 开发流程 (pnpm dev)
运行 pnpm dev 命令时实际执行 node utils/webserver.js 脚本。
2.1 开发环境配置
- 设置环境变量:
BABEL_ENV = "development"NODE_ENV = "development"
- 配置资源路径
ASSET_PATH = "/"
2.2 热重载设置
- 使用
webpack-dev-server提供本地开发服务器 - 为特定入口点添加热重载支持:
javascript
config.entry[entryName] = [
"webpack/hot/dev-server",
`webpack-dev-server/client?hot=true&hostname=localhost&port=${env.PORT}`,
].concat(config.entry[entryName]);- 排除热重载的入口点:
backgroundwebServicecontentScriptrecordWorkflowelementSelector
2.3 开发服务器配置
- 运行在
localhost和指定端口上 - 静态文件目录设置为
build目录 - 开启写入磁盘功能
writeToDisk: true(对浏览器扩展开发很重要) - 配置跨域支持
Access-Control-Allow-Origin: *
2.4 浏览器特定开发
- Chrome:
pnpm dev - Firefox:
pnpm dev:firefox(通过cross-env BROWSER=firefox设置目标浏览器)
3. 构建流程 (pnpm build)
运行 pnpm build 命令时实际执行 node utils/build.js 脚本。
3.1 生产环境配置
- 设置环境变量:
BABEL_ENV = "production"NODE_ENV = "production"
- 配置资源路径
ASSET_PATH = "/"
3.2 构建优化
- 设置 webpack 模式为
"production":config.mode = 'production' - 在生产模式下启用代码优化:
javascript
options.optimization = {
minimize: true,
minimizer: [
new TerserPlugin({
extractComments: false,
}),
],
};3.3 浏览器特定构建
- Chrome:
pnpm build - Firefox:
pnpm build:firefox(通过cross-env BROWSER=firefox设置目标浏览器)
4. 打包流程 (pnpm build:zip)
运行 pnpm build:zip 命令时实际执行 node utils/build-zip.js 脚本。
4.1 ZIP 文件生成
- 创建版本号目录:
../build-zip/${appVersion}/ - 使用
archiver库将build目录内容压缩为 ZIP 格式 - 生成文件名格式:
${packageName}-${browser}-v${appVersion}.zip - 压缩级别设置为最高:
{ zlib: { level: 9 } }
4.2 生产发布流程
- Chrome:
pnpm build:prod-chrome(运行build然后build:zip) - Firefox:
pnpm build:prod-firefox(运行build:firefox然后build:zip) - 全平台:
pnpm build:prod(同时构建 Chrome 和 Firefox 版本)
5. Webpack 配置分析
5.1 入口点配置
javascript
entry: {
sandbox: path.join(__dirname, 'src', 'sandbox', 'index.js'),
execute: path.join(__dirname, 'src', 'execute', 'index.js'),
newtab: path.join(__dirname, 'src', 'newtab', 'index.js'),
popup: path.join(__dirname, 'src', 'popup', 'index.js'),
params: path.join(__dirname, 'src', 'params', 'index.js'),
background: path.join(__dirname, 'src', 'background', 'index.js'),
contentScript: path.join(__dirname, 'src', 'content', 'index.js'),
offscreen: path.join(__dirname, 'src', 'offscreen', 'index.js'),
recordWorkflow: path.join(__dirname, 'src', 'content', 'services', 'recordWorkflow', 'index.js'),
webService: path.join(__dirname, 'src', 'content', 'services', 'webService.js'),
elementSelector: path.join(__dirname, 'src', 'content', 'elementSelector', 'index.js'),
}5.2 加载器配置
- Vue 单文件组件处理:
vue-loader - CSS 处理:
MiniCssExtractPlugin.loader、css-loader、postcss-loader - 国际化文件处理:
@intlify/vue-i18n-loader - JavaScript 处理:
babel-loader、source-map-loader
5.3 插件配置
VueLoaderPlugin:处理 Vue 单文件组件CleanWebpackPlugin:清理构建目录CopyWebpackPlugin:复制静态资源(如manifest.json和图标)HtmlWebpackPlugin:为每个入口点生成 HTML 文件MiniCssExtractPlugin:提取 CSS 到单独文件webpack.DefinePlugin:定义环境变量和 Vue 特定配置
5.4 清单文件处理
动态生成 manifest.json 文件:
javascript
from: env.NODE_ENV === 'development' && env.BROWSER === 'chrome'
? `src/manifest.${env.BROWSER}.dev.json`
: `src/manifest.${env.BROWSER}.json`,
to: path.join(__dirname, 'build', 'manifest.json'),5.5 环境差异
- 开发环境:启用源映射
cheap-module-source-map - 生产环境:启用代码压缩,使用
TerserPlugin优化
6. 开发建议
贡献新功能
- 理解目录结构和 webpack 配置
- 按照现有模式添加新的功能模块
调试技巧
- 使用
pnpm dev命令启动开发服务器 - 将扩展加载到浏览器时指向
build目录 - 利用浏览器的扩展调试工具进行调试
跨浏览器兼容性
- 在两种浏览器中测试功能
- 遵循项目中处理浏览器差异的模式(如通过 manifest 文件区分)
构建优化建议
- 使用
webpack-bundle-analyzer进行优化分析 - 考虑使用并行构建提高构建速度