通常来说,我们的代码都可以至少简单区分成业务代码和第三方库。如果不做处理,每次构建时都需要把所有的代码重新构建一次,耗费大量的时间。然后大部分情况下,很多第三方库的代码并不会发生变更(除非是版本升级),因此Webpack 打包时,对于一些不经常更新的第三方库,比如 vue、vue-router,vuex、lodash等,希望能和业务代码分离开,Webpack社区有两种方案CommonsChunkPluginDLLPlugin.

对于CommonsChunkPluginwebpack每次打包实际还是需要去处理这些第三方库,只是打包完之后,能把第三方库和我们自己的代码分开(此处先不做说明)。而 DLLPlugin则是能把第三方代码完全分离开,即每次只打包项目自身的代码。

DLLPlugin: DLL(Dynamic Link Library)文件为动态链接库文件,是一种最简单粗暴并且极其有效的优化方式,使用DLLPlugin,可以把构建过程分成dlI构建过程和主构建过程(实质也就是如此)。所以对于用这种方式打包的项目,需要额外新建一个配置文件,一般会有以下两个配置文件:webpack.config.js、webpack.dll.config.js

webpack.dll.configjs 简单配置: 打包需要分离到动态库的模块

const path =require('path')
const webpack=require('webpack')
var vendors = [
"@antv/g6",
"axios",
"echarts",
"vue",
"vue-router",
"vuex"
}
module.exports = {
entry: {
vendor:vendors
},
output: {
path: path.join(__dirname, "/dist"),
filename: "Dll.js",
library: "[name]_[hash]"
}
plugins:[
new webpack.DIlPlugin({ //webpack内置的插件,不需要额外安装
path: path.join(__dirname,"/dist","manifest.json"),
//动态链接库的全局变量名称,需要和 output.library中保持一致
//该字段的值也就是输出的 manifest.json文件中 name字段的值
name: "[name]_[hash]",
context:__dirname
})
]
}

webpack.configjs: 在主构建配置文件中使用动态库文件,manifest文件给主构建流程作为查找dll的依据: DllReferencePlugin去manifestjson文件读取name值,作为从全局变量中获取动态链接库,内容时的全局变量名,因此:在webpack.dll.config.js文件中,DllPlugin 中的name 参数必须和 output.library中保持一致。

  plugins:[
new webpack.DIlReferencePlugin({ // webpack内置的插件,不需要额外安装 使用了哪些动态链接库
context: __dirname
manifest: require('./dist/manifestjson')
})
]

package.json 中增加scripts 指令配置: 此命令将依赖包合并打包为一个名为dll.js的静态资源包,同时生成一个manifest.json文件方便对 dll.js 中的模块进行引用,manifest.json 给各个模块赋予 id 以便引用。

  "scripts":{
"dllbuild": "webpack --mode production --config webpack.dll.config.js",
"dlldev": "webpack --mode development --config webpack.dll.config.js"
}

最后在index.html中引入: 在入口文件引入dll文件,生成的dll暴露出的是全局函数,因此还需要在入口文件里面引入对应的 dll文件。

  <script src="./dist/Dll.js">/script><!--注意路径 -->

其他补充:上述用法存在一些不便之处,如在webpack.config.js中要明确指出对应的 manifest.json文件。还有当依赖升级DLL需要更新时,或者加入新的第三方库,都需要手动编译一次。

Dll Link Plugin,用于简化生成 webpack DLL的插件。基于 DIlReferencePlugin。

npm install dll-link-webpack-plugin -D

在webpackconfigjs配置文件中,用 DIlLinkPlugin替换掉DIIReferencePlugin。然后运行webpack --config webpack.config.js,会自动生成DLL文件,需要更新的时候,也会自动更新

var DllLinkPlugin=require("dll-link- webpack-plugin");
module.exports={
// ...
plugins: [
new DllLinkPlugin({
config: require("webpack.dll.config.js")
})
]
};

总结DLL的作用:

1.分离代码,业务代码和第三方模块可以被打包到不同的文件里,避免打包出单个文件太大,不利于调试,

2.将单个大文件拆成多个小文件,一定情况下有利于加载(不超出浏览器一次性请求的文件数情况下,并行下载肯定比串行快)

3.提升构建速度。第三方库没有变更时,由于只构建业务代码,相比全部重新构建要快的多。

webpack性能优化方式之dll--- webpack.dll.config.js的更多相关文章

  1. webpack性能优化——DLL

    Webpack性能优化的方式有很多种,本文之所以将 dll 单独讲解,是因为 dll 是一种最简单粗暴并且极其有效的优化方式. 在通常的打包过程中,你所引用的诸如:jquery.bootstrap.r ...

  2. webpack 性能优化 dll 分包

    webpack 性能优化 dll 分包 html-webpack-externals-plugin DLLPlugin https://www.webpackjs.com/configuration/ ...

  3. 常见 Web 性能优化方式

    这篇文章是我阅读 Web Performance 101 之后的进行的粗糙的翻译作为笔记,英语还行的童鞋可以直接看原文. 这篇文章主要介绍了现代 web 加载性能(注意不涉及代码算法等),学习为什么加 ...

  4. webpack 性能优化小结

    背景 如今前端工程化的概念早已经深入人心,选择一款合适的编译和资源管理工具已经成为了所有前端工程中的标配,而在诸多的构建工具中,webpack以其丰富的功能和灵活的配置而深受业内吹捧,逐步取代了gru ...

  5. webpack性能优化

    Webpack优化打包速度以及性能优化 1.跟上技术的迭代(Node.Npm.Yarn) 2.在尽可能少的模块上应用loader 3.Plugin尽可能精简并确保可靠 4.resolve参数合理配置 ...

  6. Webpack 性能优化 (一)(使用别名做重定向)

    前言 Webpack 是 OneAPM 前端技术栈中非常重要的一部分.它非常好用,假设你还不了解它,建议你阅读这篇Webpack 入门指迷,在 OneAPM 我们用它完毕静态资源打包.ES6 代码的转 ...

  7. webpack性能优化-实战

    题外话:年初项目重构上线,项目技术栈使用vue+webpack,测试执行整个打包流程需要10分钟,同时又因涉及三个渠道,部署好环境就需半个小时,这严重延误了上线进度,因此提高webpack构建效率,成 ...

  8. react 实用的性能优化方式

    react 组件渲染分为初始化渲染和更新渲染,当我们更新某个组件的时候,只是想关键路径上组件的render,但react的默认做法是调用所以组件的reder,再生成虚拟dom进行对比,如不变则不进行更 ...

  9. webpack 性能优化 -- 待续

    文章 这篇文章挺不错的, 各方面优化都提到了, 有空研究下 文章 这个文章提出 , 增量打包用 webpack-watch 会让你打包速度飞快,  react不参与打包, 不require, 而是放在 ...

  10. Attribute操作的性能优化方式

    Attribute是.NET平台上提供的一种元编程能力,可以通过标记的方式来修饰各种成员.无论是组件设计,语言之间互通,还是最普通的框架使 用,现在已经都离不开Attribute了.迫于Attribu ...

随机推荐

  1. Chart.js (v2.9.4)概要介绍

    chart.js是一个非常优秀的开源图表插件,扩展非常灵活,同时也提供了大量的钩子函数,给与用户添加自定义插件,实现个性化的需求. 具体的优势特点,这里不详述,网上大把资料,现开始正式深入了解这个插件 ...

  2. IceRPC之深入理解调度管道->快乐的RPC

    作者引言 很高兴啊,我们来到了IceRPC之深入理解调度管道->快乐的RPC,为上篇的续篇,深入理解常见的调度类型, 基础引导,有点小压力,打好基础,才能让自已不在迷茫,快乐的畅游世界. 传入请 ...

  3. Vue cli之创建组件

    一般在开发中,我们会人为把组件分2个目录存放,一个代表的页面组件,另一个代表页面一部分的子组件. src/ |- views/ |- Home.vue |- components/ |- App.vu ...

  4. WPF开发快速入门【0】前言与目录

    前言 WPF是一个生不逢时的技术,刚推出的时候由于是XP时代,WPF技术有两个不方便的地方: 1.由于操作系统没有自带Framework,需要另外安装,比较麻烦: 2.程序第一次启动时,由于要加载Fr ...

  5. 将任意程序安装成windows服务

    某些时候,一个程序控制台服务程序需要在系统启动的时候自动运行,这时候我们会想到采用windows服务的方式来实现 但是,如果程序本来不支持安装成服务的话,我就需要采用其他方案来实现 之前博主也遇到了类 ...

  6. Java中File类和I/O

    目录 File 类 File 构造方法 输入输出(I/O) 字节流与字符流 输入流与输出流 输入输出字节流 构造方法 方法 InputStream 基本方法 public int read() thr ...

  7. 阿里云ECS后台CPU占用100%,top却找不到

    上周公司阿里云服务器后台报警,CPU占用瞬间飙升到100%: 首先想到使用top命令查询CPU占用详情: 发现进程占用CPU都比较低,在CPU占用一栏发现只有ni的占用比较高. 先了解一下CPU相关监 ...

  8. python重拾第十二天-sqlalchemy ORM

    本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM介绍 orm英文全称object relational mapping ...

  9. 设备树DTS 学习:学习总结(应用篇)

    设备树DTS 学习:学习总结(应用篇) 背景 经过前几章的学习,我们可以说是掌握了设备树的基础用法,现在作为总结回顾. 1.设备树DTS 学习:有关概念 介绍了什么是设备树,设备树的作用,如何编译设备 ...

  10. C#中关于 object,dynamic 一点使用心得

    首先说一下使用场景  WebAPI接口入参使用 object和 dynamic 后续解析和处理 1.object和dynamic 区别 在.NET中,object和dynamic也有一些区别: obj ...