版权声明:本博客主要记录学习笔记和遇到的一些问题解决方案,转载请注明出处! https://blog.csdn.net/u010982507/article/details/79534189
为什么要提取公共代码
将项目中的公共模块提取出来,可以减少代码的冗余度,提高代码的运行效率和页面的加载速度。
使用CommonsChunkPlugin提取公共代码
- 初始化工程
1、创建工程空目录Test
2、进入Test目录
3、使用npm初始化工程 npm init
4、创建webpack.config.js文件 - 安装webpack
npm install webpack --save-dev
因为CommonsChunkPlugin是webpack内置插件,所以要将webpack装在项目中。 - 配置webpack.config,js,主要在plugins属性中配置参数
1、引入webpack模块,需要在项目环境中安装webpack
2、在plugins节点中新建一个CommonsChunkPlugin实例
new webpack.optimize.CommonsChunkPlugin(options);
3、CommonsChunkPlugin方法中参数是一个对象,对象属性有:
name:提取公共代码的js文件名,如:common
names:字符串数组,打包的文件名称
minChunks: 指定重复代码几次之后就提取出来
chunks:// 指定提取范围
var webpack = require('webpack');
var path = require('path');
module.exports = {
entry: {
'subPageA': './src/subPageA', // 公共代码提取是针对多entry的,在单一entry下是体现不出来的
'subPageB': './src/subPageB'
},
output: {
path: path.resolve(__dirname, './dist'), //__dirname 代表当前目录
filename: "[name].bundle.js"
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: 'common', // 如果还要提取公共代码,在新建一个实例
minChunks: 2, //重复两次之后就提取出来
chunks: ['subPageA', 'subPageB'] // 指定提取范围
})
]
}
代码示例
- 新建js公共模块文件module.js,并添加代码
export default 'module';
- 新建subPageA.js文件,并添加代码
import './module'
export default 'subPageA';
- 新建subPageB.js文件,并添加代码
import './module'
export default 'subPageB';
由此可见,subPageA和subPageB都加载了公共模块module.js,如果不进行公共代码提取的话就会重复加载module.js,所以要对webpack.config.js做公共代码提取操作。
- 配置webpack.config.js如下,先不做公共代码提取
var path = require('path');
module.exports = {
entry: {
'subPageA': './src/subPageA', // 公共代码提取是针对多entry的,在单一entry下是体现不出来的
'subPageB': './src/subPageB'
},
output: {
path: path.resolve(__dirname, './dist'), //__dirname 代表当前目录
filename: "[name].bundle.js"
}
}
执行webpack
命令打包,subPageA结果如下:
// 前面还有一大堆webpack的js代码,这里就不粘贴出来了
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* unused harmony default export */ var _unused_webpack_default_export = ('module'); // 这里是公共模块
/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__module__ = __webpack_require__(0);
/* harmony default export */ __webpack_exports__["default"] = ('subPageA');
/***/ })
/******/ ]);
subPageB结果如下:
// 前面还有一大堆webpack的js代码,这里就不粘贴出来了
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* unused harmony default export */ var _unused_webpack_default_export = ('module');// 这里是公共模块
/***/ }),
/* 1 */,
/* 2 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__module__ = __webpack_require__(0);
/* harmony default export */ __webpack_exports__["default"] = ('subPageB');
/***/ })
/******/ ]);
如果项目中一个页面要用到这两个js则会重复引用大量代码,所以我们要提取公共代码。
配置webpack.config.js文件,如下:
var webpack = require('webpack');
var path = require('path');
module.exports = {
entry: {
'subPageA': './src/subPageA', // 公共代码提取是针对多entry的,在单一entry下是体现不出来的
'subPageB': './src/subPageB'
},
output: {
path: path.resolve(__dirname, './dist'), //__dirname 代表当前目录
filename: "[name].bundle.js"
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: 'common', // 公共js模块名称
minChunks: 2, //重复两次之后就提取出来
chunks: ['subPageA', 'subPageB'] // 指定提取范围
})
]
}
执行webpack
命令打包,subPageA.js打包后结果如下:
webpackJsonp([1],[
/* 0 */,
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__module__ = __webpack_require__(0);
/* harmony default export */ __webpack_exports__["default"] = ('subPageA');
/***/ })
],[1]);
subPageA.js打包后结果如下:
webpackJsonp([0],{
/***/ 2:
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__module__ = __webpack_require__(0);
/* harmony default export */ __webpack_exports__["default"] = ('subPageB');
/***/ })
},[2]);
打包后提取生成的common.bundle.js结果如下:
// 前面还是一大堆webpack的js代码,同样被提取到公共js中
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* unused harmony default export */ var _unused_webpack_default_export = ('module'); // 公共模块
/***/ })
/******/ ]);
到此,公共模块就被提取出来了。
打包第三方库
如打包lodash,在subPageA和subPageB中引入lodashimport * as _ from "lodash";
并在webpack.config.js中配置
var webpack = require('webpack');
var path = require('path');
module.exports = {
entry: {
'subPageA': './src/subPageA', // 公共代码提取是针对多entry的,在单一entry下是体现不出来的
'subPageB': './src/subPageB',
'vendor': ['lodash'] // 打包第三方代码
},
output: {
path: path.resolve(__dirname, './dist'), //__dirname 代表当前目录
filename: "[name].bundle.js",
chunkFilename: "[name].chunk.js"
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: 'common', // 如果还要提取公共代码,在新建一个实例
minChunks: 2, //重复两次之后就提取出来
chunks:['pageA','pageB'] // 指定提取范围
}),
new webpack.optimize.CommonsChunkPlugin({ // 提取第三方代码
name: 'vendor',
minChunks: Infinity
})
]
}