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

一、前言

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. indexOf刚开始写成IndexOf出错

    {{# if(d.fronturlmin ==null||d.fronturlmin ==""){ }} <img src="@System.Configurati ...

  2. 使用styled-components实现CSS in JS

    前面的话 使用jsx语法可以实现HTML in JS,使用svgr可以实现svg in JS,使用styled-components可以实现CSS in JS.这样,使用react开发,就变成了使用J ...

  3. Draw your Next App Idea with Ink to Code

    Imagine that you’ve just been struck by inspiration for your next great app. You might start by jott ...

  4. Reading Text from Images Using C#

    Introduction By using Optical Character Recognition (OCR), you can detect and extract handwritten an ...

  5. Build 2017 Revisited: .NET, XAML, Visual Studio

    For the next couple months we're going to revisit Build 2017, each post focusing on different aspect ...

  6. CentOS 部署.net core 2.0 项目

    上传项目到服务器 安装Nginx(反向代理服务器),配置文件 https://www.cnblogs.com/xiaonangua/p/9176137.html 安装supervisor https: ...

  7. [十]SpringBoot 之 普通类获取Spring容器中的bean

    我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...

  8. Luogu4726 【模板】多项式指数函数(NTT+多项式求逆)

    https://www.cnblogs.com/HocRiser/p/8207295.html 安利! #include<iostream> #include<cstdio> ...

  9. SPOJ10707 COT2 - Count on a tree II 【树上莫队】

    题目分析: 考虑欧拉序,这里的欧拉序与ETT欧拉序的定义相同而与倍增LCA不同.然后不妨对于询问$u$与$v$让$dfsin[u] \leq dfsin[v]$,这样对于u和v不在一条路径上,它们可以 ...

  10. 洛谷3705 [SDOI2017] 新生舞会 【01分数规划】【KM算法】

    题目分析: 裸题.怀疑$ O(n^4log{n}) $跑不过,考虑Edmonds-Karp优化. 代码: #include<bits/stdc++.h> using namespace s ...