webpack(5)_提取公共代码

版权声明:本博客主要记录学习笔记和遇到的一些问题解决方案,转载请注明出处! 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
        })
    ]
}

猜你喜欢

转载自blog.csdn.net/u010982507/article/details/79534189