详解用webpack的CommonsChunkPlugin提取公共代码的3种方式


Posted in Javascript onNovember 09, 2017

Webpack 的 CommonsChunkPlugin 插件,负责将多次被使用的 JS 模块打包在一起。

CommonsChunkPlugin 能解决的问题

在使用插件前,考虑几个问题:

  1. 对哪些 chunk 进行提取,这决定了 chunks ,children 和 name 要怎么配置
  2. common chunk 是否异步,这决定了 async 怎么配置
  3. common chunk 的粒度,这决定了 minChunks 和 minSize 怎么配置

以下是官方给出的常用的场景:

  1. 提取两个及两个以上 Chunk 的公共代码
  2. 将 Code Split 切割出来的 Chunk「就是子 Chunk」,提取到父 Chunk
  3. 将 Code Split 切割出来的 Chunk,提取到一个新的异步加载的 Chunk
  4. 提取某个类似 jquery 或 react 的代码库

前面我们实现了 多页面分离资源引用,按需引用JS和css

但有一个问题:最后生成的3个js,都有重复代码,我们应该把这部分公共代码单独提取出来。

方式一,传入字符串参数

new webpack.optimize.CommonsChunkPlugin(‘common.js'), // 默认会把所有入口节点的公共代码提取出来,生成一个common.js

var HtmlWebpackPlugin = require('html-webpack-plugin');
var webpack = require('webpack');

var extractTextPlugin = require('extract-text-webpack-plugin');

module.exports = {
  // entry是入口文件,可以多个,代表要编译那些js
  //entry:['./src/main.js','./src/login.js','./src/reg.js'],

  entry:
  {
    'main':'./src/main.js',
    'user':['./src/login.js','./src/reg.js'],
    'index':['./src/index.js']
  },

  externals:{
    'jquery':'jQuery'
  },

  module:{
    loaders:[
      // {test:/\.css$/,loader:'style-loader!css-loader'},
      {test:/\.css$/,loader:extractTextPlugin.extract('style','css')}
    ],
  },

  output:{
    path: __dirname+'/build/js', // 输出到那个目录下(__dirname当前项目目录)
    filename:'[name].js' //最终打包生产的文件名
  },

  plugins:[
    new HtmlWebpackPlugin({
      filename: __dirname+'/build/html/login-build.html',
      template:__dirname+'/src/tpl/login.html',
      inject:'body',
      hash:true,
      chunks:['main','user','common.js']  // 这个模板对应上面那个节点
    }),

    new HtmlWebpackPlugin({
      filename: __dirname+'/build/html/index-build.html',
      template:__dirname+'/src/tpl/index.html',
      inject:'body',
      hash:true,
      chunks:['index','common.js']  // 这个模板对应上面那个节点
    }),

    // css抽取
    new extractTextPlugin("[name].css"),

    // 提供公共代码
    new webpack.optimize.CommonsChunkPlugin('common.js'), // 默认会把所有入口节点的公共代码提取出来,生成一个common.js
  ]
};

方式二,有选择的提取公共代码

// 提供公共代码
// 默认会把所有入口节点的公共代码提取出来,生成一个common.js
// 只提取main节点和index节点
new webpack.optimize.CommonsChunkPlugin('common.js',['main','index']),

方式三,有选择性的提取(对象方式传参)

推荐

new webpack.optimize.CommonsChunkPlugin({
      name:'common', // 注意不要.js后缀
      chunks:['main','user','index']
    }),

通过CommonsChunkPlugin,我们把公共代码专门抽取到一个common.js,这样业务代码只在index.js,main.js,user.js

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
复制本贴标题和地址的js代码
Jul 01 Javascript
javascript 冒泡排序 正序和倒序实现代码
Dec 14 Javascript
使用 Node.js 做 Function Test实现方法
Oct 25 Javascript
node.js中的fs.readSync方法使用说明
Dec 17 Javascript
jQuery实现高亮显示的方法
Mar 10 Javascript
完美实现bootstrap分页查询
Dec 09 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
Jul 25 Javascript
vue父组件向子组件(props)传递数据的方法
Jan 02 Javascript
浅谈super-vuex使用体验
Jun 25 Javascript
详解小程序如何避免多次点击,重复触发事件
Apr 08 Javascript
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
Sep 03 Javascript
如何阻止小程序遮罩层下方图层滚动
Sep 05 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
Nov 09 #Javascript
jQuery实现动态添加节点与遍历节点功能示例
Nov 09 #jQuery
简单实现jquery隔行变色
Nov 09 #jQuery
基于Datatables跳转到指定页的简单实例
Nov 09 #Javascript
浅谈vue2 单页面如何设置网页title
Nov 08 #Javascript
jQuery实现的简单无刷新评论功能示例
Nov 08 #jQuery
js使用xml数据载体实现城市省份二级联动效果
Nov 08 #Javascript
You might like
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
php生成二维码时出现中文乱码的解决方法
2014/12/18 PHP
php对数组内元素进行随机调换的方法
2015/05/12 PHP
PHP数组生成XML格式数据的封装类实例
2016/11/10 PHP
PHP实现的XML操作类【XML Library】
2016/12/29 PHP
认识延迟时间为0的setTimeout
2008/05/16 Javascript
JavaScript异步调用定时方法并停止该方法实现代码
2012/03/16 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
javascript实现控制div颜色
2015/07/07 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
JavaScript数据类型转换的注意事项
2016/07/31 Javascript
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
详解webpack运行Babel教程
2018/06/13 Javascript
[00:34]TI7不朽珍藏III——地穴编织者不朽展示
2017/07/15 DOTA
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
Python fileinput模块使用实例
2015/06/03 Python
浅谈Python中函数的参数传递
2016/06/21 Python
基于python中staticmethod和classmethod的区别(详解)
2017/10/24 Python
django实现同一个ip十分钟内只能注册一次的实例
2017/11/03 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
斯凯奇美国官网:SKECHERS美国
2016/08/20 全球购物
印尼购物网站:iLOTTE
2019/10/16 全球购物
大学生的应聘自我评价
2013/12/13 职场文书
校园奶茶店创业计划书
2014/01/23 职场文书
同事吵架检讨书
2014/02/05 职场文书
银行奉献演讲稿
2014/09/16 职场文书
居委会个人对照检查材料思想汇报
2014/09/29 职场文书
镇党政领导班子民主生活会思想汇报
2014/10/11 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
2015年世界水日活动总结
2015/02/09 职场文书
同事去世追悼词
2015/06/23 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
创业项目大全(适合在家创业的项目)
2019/08/15 职场文书
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB
MySQ InnoDB和MyISAM存储引擎介绍
2022/04/26 MySQL