---恢复内容开始---

一、前言

1、多入口文件配置

                              2、CommonsChunkPlugin的用法

                              3、在上面例子的基础上,抽离出vue模块

                              4、接下来需要单独抽离webpack运行文件

                              5、抽取公共模块

二、主要内容

1、多入口文件配置

很多时候我们不仅仅只有一个入口文件,当有多个入口文件的时候,我们也需要对应输出多个出口文件

  (1)项目结构如图所示

  

  (2)在main1.js , main2.js中都用到了公共的common.js文件

  common.js

export const common =' 公共的文件'

  main1.js

import {common} from './common.js'
import Vue from 'vue'
console.log(Vue,`main1${common}`);

  main2.js

import {common} from './common.js'
import Vue from 'vue'
console.log(Vue,`main2${common}`);

  (3)需要在config文件中配置

var path = require('path');

const HtmlWebpackPluginn = require('html-webpack-plugin')

module.exports = {
//入口
entry:{
"main1":"./src/main1.js",
"main2":"./src/main2.js"
},
output:{
path:path.resolve('./dist'),
filename:'[name].js' //这里会对main.js 和main2.js都进行输出
}, watch:true,
}

  (4)查看到项目中多出了两个main.js和main2.js

  (6)查看打包出来的main1.js和main2.js文件,发现common.js和vue.js这样的公共文件都被打包进去了,这样很不合理,公共模块重复打包,导致体积过大

  (7)所以接下来需要分离第三方库,自定义公共模块,webpack运行文件

2、CommonsChunkPlugin

  (1)CommonsChunkPlugin的用法

  CommonsChunkPlugin主要是用来提取第三方库和公共模块,避免首屏加载的bundle文件或者按需加载的bundle文件体积过大,从而加载时间过长。

(2)chunk的分类

  • wepack当中配置的入口文件(entry)是chunk, 可以理解为entry chunk
  • 入口文件以及他的依赖文件通过code splite(代码分割)出来的也是chunk, 可以理解为children chunk
  • 通过CommonsChunkPlugin创建出来的文件也是chunk,可以理解为commons chunk

  (3)CommonsChunkPlugin可以配置的属性

  • name:可以是已经存在的chunk(一般入口文件)  对应的name,那么就将公共模块合并到这个chunk上; 否则,会创建名字为name的commons chunk进行合并
  • filename:指定commons chunk文件名
  • chunks:指定source chunk, 即指定从哪些chunk当中去找公共模块,省略该选项的时候默认就是entry chunks
  • minChunks:既可以是数字,也可以是函数,还可以是infinty,

  (4)验证三种情况

不分离第三方库和自定义公共模块

分离出第三方库,自定义公共模块,webpack运行文件,但是这些在同一个文件中

单独分离第三方库,自定义公共模块,webpack运行文件,各自在不同文件

3、在上面例子的基础上,抽离出vue模块,package.json中dependencies中的第三方库文件

(1) 此时package.json如下

{
"name": "chunk",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "webpack --config ./webpack.dev.config.js",
"prod": "webpack --config ./webpack.prod.config.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"html-webpack-plugin": "^3.2.0",
"webpack": "^2.6.1"
},
"dependencies": {
"vue": "^2.6.10"
}
}

(2) config配置文件如下,需要安装插件,抽离生产环境下的依赖库

var path = require('path');

const HtmlWebpackPluginn = require('html-webpack-plugin')
const webpack = require('webpack');
const packagejson = require('./package.json')
module.exports = {
//入口
entry:{
"main1":"./src/main1.js",
"main2":"./src/main2.js",
"vendor":Object.keys(packagejson.dependencies)//获取生产环境依赖库,抽离vue模块
},
output:{
path:path.resolve('./dist'),
filename:'[name].js'
},
watch:true,
plugins:[
new webpack.optimize.CommonsChunkPlugin({
name:['vendor'],//这里任意取名
filename:'[name].js'
}) ] }

  (3)测试运行:npm run dev, 发现这里输出了三个文件,查看打包生成的main1.js和main2.js文件,发现里面的代码变少了

查看生成的vendor.js文件,发现main1.js和main2.js文件中依赖的vue和common.js都被打包进vendor.js中,同时webpack的运行文件也被打包。但是我们希望vendor.js文件中只包含第三方库,不包含自定义的公共模块和webpack运行文件,或者让vendor.js中包含第三方库和公共模块,不包含webpack运行文件. 其实,这种想法是对的,特别

是分离出webpack运行文件,因为每次打包webpack运行文件都会变,如果你不分离出webpack运行文件,每次打包生成的vendor.js文件的哈希值都会变化,导致vendor.js改变。但实际上你的第三方库其实是没有变化的,然而浏览器会认为你原来缓存的vendor.js失效,又要重新去浏览器中获取。

4、接下来需要单独抽离webpack运行文件

  (1)只需要在上一步的基础上,修改config如下:

var path = require('path');

const HtmlWebpackPluginn = require('html-webpack-plugin')
const webpack = require('webpack');
const packagejson = require('./package.json')
module.exports = {
//入口
entry:{
"main1":"./src/main1.js",
"main2":"./src/main2.js",
"vendor":Object.keys(packagejson.dependencies)//获取生产环境依赖库,抽离vue模块
},
output:{
path:path.resolve('./dist'),
filename:'[name].js'
},
watch:true,
plugins:[
new webpack.optimize.CommonsChunkPlugin({
name:['vendor','runtime'],//这里任意取名,第二个输出的是webpack运行时文件
filename:'[name].js'
}) ] }

  (2) 测试发现:输出了下面四个文件

比较之后发现vendor.js明显变小了

5、抽取公共模块

只需在config文件中做两处修改

var path = require('path');

const HtmlWebpackPluginn = require('html-webpack-plugin')
const webpack = require('webpack');
const packagejson = require('./package.json')
module.exports = {
//入口
entry:{
"main1":"./src/main1.js",
"main2":"./src/main2.js",
"vendor":Object.keys(packagejson.dependencies)//获取生产环境依赖库,抽离vue模块
},
output:{
path:path.resolve('./dist'),
filename:'[name].js'
},
watch:true,
plugins:[
new webpack.optimize.CommonsChunkPlugin({
name:['vendor','runtime'],//这里任意取名,第二个输出的是webpack运行时文件
filename:'[name].js',
minChunks:Infinity//必须要加上这个才分离的出来自定义公共模块
}), new webpack.optimize.CommonsChunkPlugin({
name:'common',//这里是抽离的公共文件
filename:'[name].js',
chunks:['main1','main2']//从main1和main2中抽离出公共的common chunk
}) ] }

运行:发现多出了这几个文件

三、基础内容

---恢复内容结束---

Vue(基础七)_webpack(CommonsChunkPlug的使用)的更多相关文章

  1. Vue(基础七)_webpack打包工具用法(上)

    一.前言 1.webpack原理 二.主要内容 1.webpack原理: (1)官网图:我们的项目有多个js, css文件的时候还需要考虑先引入哪一个后引入哪一个,因为这些js文件是相互依赖的,web ...

  2. Vue(基础七)_webpack(webpack异步加载原理)

    ---恢复内容开始--- 一.前言 1.webpack异步加载原理’                                           2.webpack.ensure原理     ...

  3. Vue(基础七)_webpack使用工具(下)

    一.前言  1.webpack.config文件配置                                          2.webpack打包css文件                 ...

  4. vue基础七

    事件处理器 1.监听事件 可以用 v-on 指令监听 DOM 事件来触发一些 JavaScript 代码. <div id="example-1"> <butto ...

  5. Vue 基础篇

    Vue 基础篇 一.框架与库的区别 JQ库->DOM(DOM操作) + Ajax请求 art-template库->模板引擎 框架 -> 全方位.功能齐全 简易的DOM体验 + 发请 ...

  6. Vue基础系列(四)——Vue中的指令(上)

    写在前面的话: 文章是个人学习过程中的总结,为方便以后回头在学习. 文章中会参考官方文档和其他的一些文章,示例均为亲自编写和实践,若有写的不对的地方欢迎大家和我一起交流. VUE基础系列目录 < ...

  7. Vue基础简介

    目录 vue基础 一.导入vue 二.vue挂载点 三.vue变量 四.vue事件 五.vue文本指令 六.vue事件指令 七.vue属性指令 vue基础 一.导入vue 补充:vue的语句以及导入j ...

  8. (day65、66)Vue基础、指令、实例成员、JS函数this补充、冒泡排序

    目录 一.Vue基础 (一)什么是Vue (二)为什么学习Vue (三)如何使用Vue 二.Vue指令 (一)文本指令 (二)事件指令v-on (三)属性指令v-bind (四)表单指令v-model ...

  9. Bootstrap <基础七>按钮

    任何带有 class .btn 的元素都会继承圆角灰色按钮的默认外观.但是 Bootstrap 提供了一些选项来定义按钮的样式,具体如下表所示: 以下样式可用于<a>, <butto ...

随机推荐

  1. WinForm中在非UI线程更改控件值的办法

    从非UI线程调用UI控件赋值.或进行其他更新UI的操作的话,会出现异常: System.InvalidOperationException:“线程间操作无效: 从不是创建控件“xxx”的线程访问它.” ...

  2. axis函数

    axis函数 axis([xmin xmax ymin ymax]) 用来标注输出的图线的最大值最小值. MATLAB中坐标系的设置函数   MATLAB 函数 axis([XMIN XMAX YMI ...

  3. Redux学习(2) ----- 异步和中间件

    Redux中间件,其实就是一个函数, 当我们发送一个action的时候,先经过它,我们就可以对action进行处理,然后再发送action到达reducer, 改变状态,这时我们就可以在中间件中,对a ...

  4. css中绝对定位和相对定位详解

    相对定位relative和绝对定位absolute 相对定位 相对定位是标签在根据没加position样式前的位置来定位不会受父级标签的定位的影响,并且定位后不会脱离文本流,会占据原来的位置. 接下来 ...

  5. net core 2.0 + Autofac的坑

    控制器不能从容器中解析出来; 只是控制器构造函数参数.这意味着控制器生命周期,属性注入和其他事情不由Autofac管理 - 它们由ASP.NET Core管理.可以通过指定AddControllers ...

  6. Codeforces963C Frequency of String 【字符串】【AC自动机】

    题目大意: 给一个串s和很多模式串,对每个模式串求s的一个最短的子串使得这个子串中包含至少k个该模式串. 题目分析: 均摊分析,有sqrt(n)种长度不同的模式串,所以有关的串只有msqrt(n)种. ...

  7. 洛谷P1057传球游戏题解

    题目 这个题表面上看并不像DP,但是当我们看到方案数时,我们可能会想到什么??? 对,分类加法原理,在每一轮中,每一个点的方案数都要加上这个点左边的方案与右边的方案. 因此我们可以枚举,设一个DP数组 ...

  8. Matplotlib学习---用seaborn画联合分布图(joint plot)

    有时我们不仅需要查看单个变量的分布,同时也需要查看变量之间的联系,这时就需要用到联合分布图. 这里利用Jake Vanderplas所著的<Python数据科学手册>一书中的数据,学习画图 ...

  9. King of Destruction HDU - 3002 && HDU - 3691(全局最小割)

    求无向图的最小割 有没有源点都一样,不影响 #include <iostream> #include <cstdio> #include <sstream> #in ...

  10. 【BZOJ1565】【NOI2009】植物大战僵尸 网络流 最大权闭合子图

    题目大意 ​ 给你一个\(n\times m\)的地图,每个格子上都有一颗植物,有的植物能保护其他植物.僵尸从右往左进攻,每吃掉一颗植物就可以得到\(a_{i,j}\)的收益(\(a_{i,j}\)可 ...