文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
十一、进一步控制 JS 大小
11.1 按需加载模块
在 webpack 的构建环境中,要按需加载代码模块很简单,遵循 ES 标准的动态加载语法 dynamic-import
来编写代码即可, webpack
会自动处理使用该语法编写的模块
// import 作为一个方法使用,传入模块名即可,返回一个 promise 来获取模块暴露的对象 // 注释 webpackChunkName: "lodash" 可以用于指定 chunk 的名称,在输出文件时有用 import(/* webpackChunkName: "lodash" */ 'lodash').then((_) => { console.log(_.lash([1, 2, 3])) // 打印 3 })...
- 注意一下,如果你使用了
Babel
的话,还需要Syntax Dynamic Import
这个Babel
插件来处理import()
这种语法。 - 由于动态加载代码模块的语法依赖于
promise
,对于低版本的浏览器,需要添加promise
的polyfill
后才能使用。 - 如上的代码,webpack 构建时会自动把
lodash
模块分离出来,并且在代码内部实现动态加载lodash
的功能。动态加载代码时依赖于网络,其模块内容会异步返回,所以 import 方法是返回一个promise
来获取动态加载的模块内容。 import
后面的注释webpackChunkName: "lodash"
用于告知webpack
所要动态加载模块的名称。我们在 webpack 配置中添加一个output.chunkFilename
的配置…
output: { path: path.resolve(__dirname, 'dist'), filename: '[name].[hash:8].js', chunkFilename: '[name].[hash:8].js' // 指定分离出来的代码文件的名称 },...
这样就可以把分离出来的文件名称用 lodash 标识了,如下图:
如果没有添加注释 webpackChunkName: "lodash" 以及 output.chunkFilename
配置,那么分离出来的文件名称会以简单数字的方式标识,不便于识别
11.2 以上完整示例代码
const path = require('path') const webpack = require('webpack') const HtmlWebpackPlugin = require('html-webpack-plugin') const ExtractTextPlugin = require('extract-text-webpack-plugin') module.exports = { entry: './src/index.js', output: { path: path.resolve(__dirname, 'dist'), filename: '[name].js', }, module: { rules: [ { test: /\.jsx?/, include: [ path.resolve(__dirname, 'src'), ], use: 'babel-loader', }, { test: /\.less$/, use: ExtractTextPlugin.extract({ fallback: 'style-loader', use: [ 'css-loader', 'postcss-loader', 'less-loader', ], }), }, { test: /\.(png|jpg|gif)$/, use: [ { loader: 'url-loader', options: { limit: 8192 }, }, { loader: 'image-webpack-loader', options: { mozjpeg: { // 压缩 jpeg 的配置 progressive: true, quality: 65 }, optipng: { // 使用 imagemin-optipng 压缩 png,enable: false 为关闭 enabled: false, }, pngquant: { // 使用 imagemin-pngquant 压缩 png quality: '65-90', speed: 4 }, gifsicle: { // 压缩 gif 的配置 interlaced: false, }, webp: { // 开启 webp,会把 jpg 和 png 图片压缩为 webp 格式 quality: 75 }, }, }, ], }, ], }, optimization: { splitChunks: { cacheGroups: { vendor: { chunks: "initial", test: path.resolve(__dirname, "node_modules"), // 路径在 node_modules 目录下的都作为公共部分 name: "vendor", // 使用 vendor 入口作为公共部分 enforce: true, }, }, }, }, plugins: [ new HtmlWebpackPlugin({ filename: 'index.html', // 配置输出文件名和路径 template: 'src/index.html', // 配置文件模板 minify: { // 压缩 HTML 的配置 minifyCSS: true, // 压缩 HTML 中出现的 CSS 代码 minifyJS: true, // 压缩 HTML 中出现的 JS 代码 removeComments: true, }, }), new ExtractTextPlugin('[name].css'), new webpack.NamedModulesPlugin(), new webpack.HotModuleReplacementPlugin(), ], devServer: { hot: true } }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论