技术栈:create-ract-app、webpack
- dll.conf.js
const path = require('path')
const webpack = require('webpack')
const {
CleanWebpackPlugin
} = require('clean-webpack-plugin');
// dll文件存放的目录
const dllPath = 'public/vendor'
module.exports = {
entry: {
// 需要提取的库文件
vendor: ['react', 'react-dom', 'react-native-storage', 'react-router-dom', 'antd', 'mobx', 'mobx-react',
'react-css-modules', 'history', 'lodash', 'babel-polyfill'],
common: ['mime', 'mime-db', 'stream-http', 'ajv', 'psl', 'elliptic', 'sshpk', 'bluebird', 'pako', 'react-error-overlay']
},
output: {
path: path.join(__dirname, dllPath),
filename: '[name].dll.js',
// vendor.dll.js中暴露出的全局变量名
// 保持与 webpack.DllPlugin 中名称一致
library: '[name]_[hash]'
},
plugins: [
// 清除之前的dll文件
new CleanWebpackPlugin(),
// 设置环境变量
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify('production')
}
}),
// manifest.json 描述动态链接库包含了哪些内容
new webpack.DllPlugin({
path: path.join(__dirname, dllPath, '[name]-manifest.json'),
// 保持与 output.library 中名称一致
name: '[name]_[hash]',
context: process.cwd()
})
],
// optimization:{
// splitChunks: {
// cacheGroups: {
// vendor: {
// name: 'vendor',
// chunks: 'initial',
// minChunks: 10
// }
// }
// }
// }
}
- config-overrides.js
const addCustomize = () => config => {
if (process.env.NODE_ENV === 'production') {
config.devtool = false; //去掉map文件
config.plugins.push(
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify('production')
}
}),
new webpack.DllReferencePlugin({
context: process.cwd(),
manifest: require('./public/vendor/vendor-manifest.json')
}),
new webpack.DllReferencePlugin({
context: process.cwd(),
manifest: require('./public/vendor/common-manifest.json')
}),
// 将 dll 注入到 生成的 html 模板中
new AddAssetHtmlPlugin({
// dll文件位置
filepath: path.resolve(__dirname, './public/vendor/*.js'),
// dll 引用路径 一般设置为 CDN
publicPath: 'http://10.20.26.19/ttt/vendor',
// dll最终输出的目录
outputPath: './vendor'
}),
// 可以解析项目
new BundleAnalyzerPlugin({
analyzerMode: 'static'
})
)
}
return config;
}
module.exports = override(
addCustomize(),
)
这样打包出来dll文件有两个,一个是vendor.js,另一个是common.js,目前这样的配置能够很好的使用。
1、但我的问题是,我已经写了entry入口一些第三方包,为何打包的时候不能自动找寻入口包下面的一些引用包,需要我在common中一一列举出来,大家看看是否有其他简单的方式?
2、为何单个的dll文件为何如此大,要如何分割?
我的思路是通过fs读取目录下有哪些manifest.json,然后循环添加对应个数的DllReferencePlugin
打包出来的js体积大的原因可能有两点:
配置生产模式: