Webpack的进阶配置
- 多入口文件配置:当项目有多个页面或模块时,需要配置多个入口文件。在
webpack.config.js
中,可以这样配置:
module.exports = {
entry: {
main: './src/main.js',
vendor: './src/vendor.js'
},
output: {
filename: '[name].bundle.js',
path: __dirname + '/dist'
}
};
这里定义了两个入口文件main.js
和vendor.js
,分别对应生成main.bundle.js
和vendor.bundle.js
两个打包文件。
- 代码分割与懒加载:使用
import()
语法实现代码分割和懒加载。例如,在main.js
中:
当用户点击时,才会加载document.addEventListener('click', () => { import('./lazyModule.js').then((module) => { module.default(); }); });
lazyModule.js
,这样可以提高初始加载速度,优化用户体验。 - 优化缓存:给输出的文件名添加哈希值,以便浏览器缓存更新。修改
output.filename
配置:
这样,每次文件内容改变时,哈希值也会改变,浏览器会重新加载新的文件,而未改变的文件则可以继续使用缓存。output: { filename: '[name].[hash].bundle.js', path: __dirname + '/dist' }
Webpack的优化策略
- 压缩代码:使用
webpack
的UglifyJsPlugin
或terser-webpack-plugin
来压缩JavaScript
代码。在webpack.config.js
中:
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
optimization: {
minimize: true,
minimizer: [new TerserPlugin()]
}
};
这会在打包过程中自动压缩代码,减小文件体积,加快加载速度。
- 提取公共代码:使用
CommonsChunkPlugin
或optimization.splitChunks
来提取多个入口文件中的公共代码。例如:
module.exports = {
optimization: {
splitChunks: {
chunks: 'all',
minSize: 30000,
maxSize: 0,
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3,
automaticNameDelimiter: '~',
name: true,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true
}
}
}
}
};
这样可以避免相同代码在不同文件中重复打包,进一步减小打包文件的体积。
- 优化图片资源:使用
file-loader
或url-loader
来处理图片资源。url-loader
可以将小图片转换为base64
编码直接嵌入到CSS
或HTML
中,减少请求次数。例如:
module.exports = {
module: {
rules: [
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 8192,
name: 'images/[hash].[ext]'
}
}
]
}
]
}
};
对于小于8KB
的图片,会自动转换为base64
编码。
Babel的进阶配置
- 使用插件和预设:
Babel
通过插件和预设来实现不同的功能和语法转换。例如,要使用ES6
及以上的语法,需要安装@babel/preset-env
预设:
然后在npm install --save-dev @babel/preset-env
.babelrc
文件中配置:
如果还需要支持{ "presets": ["@babel/preset-env"] }
React
的JSX
语法,需要安装@babel/preset-react
预设,并添加到配置中:{ "presets": ["@babel/preset-env", "@babel/preset-react"] }
- 配置插件参数:有些插件需要配置参数来满足特定的需求。例如,
@babel/plugin-transform-runtime
插件可以避免重复引入Babel
的辅助函数,减少打包体积。安装插件:
在npm install --save-dev @babel/plugin-transform-runtime
.babelrc
中配置:
这里配置了{ "plugins": [ ["@babel/plugin-transform-runtime", { "corejs": 3, "helpers": true, "regenerator": true, "useESModules": false }] ] }
corejs
版本、是否使用辅助函数等参数。
Babel的优化策略
- 只编译需要的代码:使用
babel-loader
的include
或exclude
参数来指定需要编译的文件或目录,避免不必要的编译。例如:
这样只会编译module.exports = { module: { rules: [ { test: /\.js$/, include: path.resolve(__dirname, 'src'), use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'] } } } ] } };
src
目录下的JavaScript
文件,提高编译效率。 - 缓存编译结果:使用
babel-loader
的cacheDirectory
选项来缓存编译结果,下次编译时如果文件未改变则直接使用缓存,加快编译速度。修改babel-loader
的配置:
这样可以大大提高重复编译的效率,尤其是在大型项目中。{ loader: 'babel-loader', options: { presets: ['@babel/preset-env'], cacheDirectory: true } }
通过以上的进阶配置和优化策略,可以更好地发挥Webpack
与Babel
的功能,提高项目的性能和开发效率。