跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

uni-app与uniapp-cli-pack打包 uni-app如何使用webpack进行自定义打包

uni-app 打包不直接使用 webpack,而是通过封装的 uniapp-cli-pack 工具基于 webpack 深度定制;配置须经 vue.config.js 的 configureWebpack 或 chainWebpack 注入,且需适配多端差异。 uni-app 打包用的是 webpack 吗? 不是。uni-app 官方构建工具
uniapp-cli-pack
(或旧版
@dcloudio/vue-cli-plugin-uni
)底层确实基于 webpack,但做了深度封装和替换——你无法直接写
webpack.config.js
并期望它生效。 常见错误现象:
webpack.config.js
文件存在、配置了
resolve.alias
或
externals
,但运行
npm run build:mp-weixin
时完全不生效,甚至没报错。 uni-app 的 webpack 实例由插件在内存中动态生成,不读取项目根目录下的
webpack.config.js
所有 webpack 相关定制必须通过
vue.config.js
的
configureWebpack
或
chainWebpack
钩子注入 部分平台(如小程序)会二次覆盖配置,比如微信小程序构建会强制重写
output.filename
和
runtimeChunk
,硬改可能被忽略 如何在 vue.config.js 中安全修改 webpack 配置? 必须用
configureWebpack
(对象/函数)或更推荐的
chainWebpack
(链式调用),且需区分平台和构建模式。 使用场景:你想给 H5 端加 CDN 外链,或给 App 端排除某个大体积模块,或调试时启用
source-map
。
configureWebpack
适合简单合并,例如:
module.exports = { configureWebpack: { devtool: 'source-map' } }
,但注意:H5 和小程序的
devtool
值不同,小程序只支持
hidden-source-map
chainWebpack
更精准,可按平台条件操作:
chainWebpack: config => { if (process.env.UNI_PLATFORM === 'mp-weixin') { config.plugin('html').tap(args => { args[0].title = '微信小程序'; return args; }); } }
不要在
configureWebpack
里直接改
entry
或
output.path
,uni-app 已预设好多端路径逻辑,改了会导致资源找不到 为什么改了配置却没生效?常见兼容性陷阱 不是配置写错了,而是 uni-app 构建流程在你之后又覆盖了一次。 典型表现:
console.log
显示配置已注入,但最终打包产物没变化,或者 H5 正常、小程序报
Cannot find module 'xxx'
。 小程序平台会自动把
node_modules
中非
uni-app
兼容的包转成 inline,如果你用
externals
排除某个包,它可能被跳过处理,导致运行时报错 H5 端支持
public
目录静态资源,但小程序不读该目录;想加全局 JS 脚本,H5 可用
script
标签,小程序得走
uni.requireNativePlugin
或自定义原生层 uni-app 2.x 和 3.x 的插件版本对
chainWebpack
支持程度不同:2.x 中部分 chain 方法(如
config.module.rule('scss').oneOfs
)不可用,容易静默失败 替代方案:真需要深度控制,就别绕开 webpack 当
vue.config.js
钩子也无法满足(比如要替换整个 loader、接入自定义 plugin、做代码分割策略),说明你已超出 uni-app 抽象层的设计边界。 这时有两个务实选择: 放弃
uniapp-cli-pack
,改用
webpack
+
@dcloudio/uni-app
运行时手动搭,但你要自己维护多端入口、生命周期桥接、样式编译逻辑——成本高,仅适合超大型定制项目 用
uni-app
做主体,把强依赖 webpack 定制的部分抽成独立 H5 子应用,用
web-view
或 iframe 嵌入,保持主流程稳定 最常被忽略的一点:很多所谓“需要 webpack 控制”的需求,其实用
uni-app
自身机制就能解决——比如按需加载用
import()
动态导入,而非靠
SplitChunksPlugin
;环境变量用
process.env.UNI_APP_X
,而非
DefinePlugin
真正难的从来不是怎么写配置,而是判断哪部分该交给 uni-app,哪部分该自己扛。

相关文章