详解用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 相关文章推荐
Expandable "Detail" Table Rows
Aug 29 Javascript
Javascript 同时提交多个Web表单的方法
Feb 19 Javascript
jQuery学习7 操作JavaScript对象和集合的函数
Feb 07 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
Aug 24 Javascript
常见JS验证脚本汇总
Dec 01 Javascript
JavaScript的设计模式经典之代理模式
Feb 24 Javascript
JavaScript SHA1加密算法实现详细代码
Oct 06 Javascript
angular实现IM聊天图片发送实例
May 08 Javascript
微信小程序日历/日期选择插件使用方法详解
Dec 28 Javascript
vue-router两种模式区别及使用注意事项详解
Aug 01 Javascript
JavaScript实现像雪花一样的Hexaflake分形
Jul 07 Javascript
vue使用过滤器格式化日期
Jan 20 Vue.js
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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
PHP+MySQL 制作简单的留言本
2009/11/02 PHP
php类声明和php类使用方法示例分享
2014/03/29 PHP
PHP框架Laravel的小技巧两则
2015/02/10 PHP
关于PHP开发的9条建议
2015/07/27 PHP
php实现当前页面点击下载文件的简单方法
2016/09/22 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
Tab页界面,用jQuery及Ajax技术实现
2009/09/21 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
学习Bootstrap组件之下拉菜单
2015/07/28 Javascript
JS实现微信弹出搜索框 多条件查询功能
2016/12/13 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
2016/12/20 Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
2019/04/09 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
详解用async/await来处理异步
2019/08/28 Javascript
js实现提交前对列表数据的增删改查
2020/01/16 Javascript
Python中的单行、多行、中文注释方法
2018/07/19 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
python移位运算的实现
2019/07/15 Python
如何搭建pytorch环境的方法步骤
2020/05/06 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
2020/10/15 Python
比利时网上药店: Drogisterij.net
2017/03/17 全球购物
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
军训教官感言
2014/03/02 职场文书
酒店仓管员岗位职责
2014/04/28 职场文书
企业员工集体活动方案
2014/08/17 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
党员民主评议个人总结
2014/10/20 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书
2014年学校办公室工作总结
2014/12/19 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书
企业党建工作总结2015
2015/05/26 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
Pytorch中Softmax与LogSigmoid的对比分析
2021/06/05 Python
js面向对象编程OOP及函数式编程FP区别
2022/07/07 Javascript