zoukankan      html  css  js  c++  java
  • webpack 简单笔记(二)CommonsChunkPlugin插件

    接下来就要使用CommonsChunkPlugin插件

    (一)单一入口,模块单一引用,分文件输出,单一入口,模块重复引用,分文件输

    main.js代码

    require('./static/js/main1.js')
    require('./static/js/main2.js')
    console.log('I`m main.js');

    webpack.config.js代码 

    'use strict'
    const path = require('path');
    const webpack = require('webpack')
    
    module.exports = {
        entry:{
            main:'./main.js'
        },
        output:{
            path: path.resolve(__dirname, './dist'),
            filename:'bundle.js'
        },
        plugins:[
            new webpack.optimize.CommonsChunkPlugin({
                name:'app',  // ( 公共chunk(commnons chunk) 的名称)
                filename: "app.js",   // ( 公共chunk 的文件名)
            })
        ]
    }

     输出文件main.js main.js,main1.js,main2.js,都被打包到main.js里

    webpackJsonp([0],[
    /* 0 */
    /***/ (function(module, exports) {
    
    
    var chunk2=2;
    exports.chunk2=chunk2;
    console.log('chunk2')
    
    /***/ }),
    /* 1 */
    /***/ (function(module, exports, __webpack_require__) {
    
    __webpack_require__(2)
    __webpack_require__(0)
    console.log('I`m main.js');
    
    /***/ }),
    /* 2 */
    /***/ (function(module, exports, __webpack_require__) {
    
    __webpack_require__(0);
    var chunk1=1;
    exports.chunk1=chunk1;
    console.log('chunk1')
    
    /***/ })
    ],[1]);

    单一入口,模块单一引用,分文件输出和单一入口,模块重复引用,分文件输是一样的

    main2.js模块被引用了两次.打包后,所有模块还是被打包到main.js中

    (二)多入口,模块重复引用,分文件输出(将多次引用的模块打包到公共模块)

    webpack.config.js

    'use strict'
    const path = require('path');
    const webpack = require('webpack')
    
    module.exports = {
        entry:{
            main:'./main.js',
             maindemo:'./maindemo.js'
        },
        output:{
            path: path.resolve(__dirname, './dist'),
            filename:'[name].js'
        },
        plugins:[
            new webpack.optimize.CommonsChunkPlugin({
                name:'app',  // ( 公共chunk(commnons chunk) 的名称)
                //filename: "app.js",   // ( 公共chunk 的文件名)
                  minChunks: 2
            })
        ]
    }

    打包完我们可以看到

    app.js中代码

    (function(module, exports) {
    
    
    var chunk2=2;
    exports.chunk2=chunk2;
    console.log('chunk2')
    
    /***/ }),
    /* 1 */
    /***/ (function(module, exports, __webpack_require__) {
    
    __webpack_require__(0);
    var chunk1=1;
    exports.chunk1=chunk1;
    console.log('chunk1')

    这里把main1.js和main2.js打包到app.js。

    这些是基础的使用。接下来看一下项目中的使用

    (三)项目中分vendor,manifest,app打包

       new webpack.optimize.CommonsChunkPlugin({
          name: 'vendor',
         minChunks (module,count) {
    // any required modules inside node_modules are extracted to vendor return ( module.resource && /.js$/.test(module.resource) && module.resource.indexOf( path.join(__dirname, '../node_modules') ) === 0 ) } }) //提取公共代码 new webpack.optimize.CommonsChunkPlugin({ name: 'manifest', //应当在生成入口 chunk 时,尽量减少入口 chunk 的体积,以提高性能。下述代码块将 //只提取包含 runtime 的 chunk ,其他 chunk 都作为子模块: minChunks: Infinity }), // This instance extracts shared chunks from code splitted chunks and bundles them // in a separate chunk, similar to the vendor chunk // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk new webpack.optimize.CommonsChunkPlugin({ name: 'app', // 如果设置为 `true`,一个异步的 公共chunk 会作为 `options.name` 的子模块,和 `options.chunks` 的兄弟模块被创建。 // 它会与 `options.chunks` 并行被加载。 async: 'vendor-async', children: true,// 如果设置为 `true`,所有 公共chunk 的子模块都会被选择 minChunks: 3 }),

    1.其中的 vendor 的chunk 是打包公共组件的代码,分离公共js到vendor中,声明公共的模块来自node_modules文件夹

    minChunks: number|Infinity|function(module, count) -> boolean,
      // 在传入  公共chunk(commons chunk) 之前所需要包含的最少数量的 chunks 。
      // 数量必须大于等于2,或者少于等于 chunks的数量
      // 传入 `Infinity` 会马上生成 公共chunk,但里面没有模块。
      // 你可以传入一个 `function` ,以添加定制的逻辑(默认是 chunk 的数量)

    注:结合长期缓存,你可能需要使用这个插件去避免 公共chunk 改变。 你也需要使用 records 去保持稳定的模块 id,例如,使用 NamedModulesPlugin 或 HashedModuleIdsPlugin

    2. 上面虽然已经分离了第三方库,每次修改编译都会改变vendor的hash值,导致浏览器缓存失效。原因是vendor包含了webpack在打包过程中会产生一些运行时代码,运行时代码中实际上保存了打包后的文件名。

    当修改业务代码时,业务代码的js文件的hash值必然会改变。一旦改变必然会导致vendor变化。vendor变化会导致其hash值变化。

    maifest下面主要是将运行时代码提取到单独的manifest文件中,防止其影响vendor.js

    注:CommonsChunkPlugin 可以用于将模块分离到单独的文件中。然而 CommonsChunkPlugin 有一个较少有人知道的功能是,能够在每次修改后的构建结果中,将 webpack 的样板(boilerplate)和 manifest 提取出来。通过指定 entry 配置中未用到的名称,此插件会自动将我们需要的内容提取到单独的包中:

    注意,引入顺序在这里很重要。CommonsChunkPlugin 的 'vendor' 实例,必须在 'manifest' 实例之前引入。

    minChunks设置为Infinity这个配置保证没其它的模块会打包进 公共chunk

    3.当设置async的意思是:用新的异步加载的额外公共chunk。当下载额外的 chunk 时,它将自动并行下载。

  • 相关阅读:
    ros 无线WDS MESH配置一(这个不好用,没有方法二好用)
    ROS脚本编辑器Notepad++装一个mikrotik的插件 RouterOS-Syntax-highliter
    关于ip-neighbor里的mac telnet的一些说明
    ros无线2G和5G的带宽简单计算
    ros的AP创建20个虚拟AP-VAP的脚本
    python异常值(outlier)检测实战:KMeans + PCA + IsolationForest + SVM + EllipticEnvelope
    str.replace替换变量名的字符串
    pd.ExcelWriter(to_excel)保存结果到已存在的excel文件中
    pandas.DataFrame.dropna删除缺失值
    pandas.DataFrame.astype数据结构转换
  • 原文地址:https://www.cnblogs.com/myzy/p/8427782.html
Copyright © 2011-2022 走看看