前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >webpack dll 提升构建速度

webpack dll 提升构建速度

作者头像
奋飛
发布于 2023-03-09 12:17:33
发布于 2023-03-09 12:17:33
1.2K00
代码可运行
举报
文章被收录于专栏:Super 前端Super 前端
运行总次数:0
代码可运行

DLL,动态链接库(Dynamic Link Library 或者 Dynamic-link Library),由微软公司提出。目的是为了节约应用程序所需的磁盘和内存空间。

在一个传统的非共享库中,如果两个程序调用同一个子程序,就会出现两份那段代码。让多个应用共享的代码切分到一个DLL中,在硬盘上存为一个文件,在内存中使用一个实例(instance)。

DllPluginDllReferencePlugin 用某种方法实现了拆分 bundles,同时还大幅度提升了构建的速度。

  1. 把公共代码打包为 DLL 文件存到硬盘里;
  2. 第二次打包时动态链接 DLL 文件,不重新打包;
  3. 打包时间缩短。

使用场景

在使用 webpack 开发过程中,对于大量第三方包(如vue、vue-router、axios等),并不是经常发生变化。每次编译时都重新构建这些资源,浪费了大量的时间。借助 DLL 思路,webpack 中引入了 DllPluginDllReferencePlugin ,允许拆分指定的第三方包、并创建单独的包,生成 manifest.json 二次构建跳过这部分编译,并教 Webpack 将它们引用到该包。以此提高整体构建速度。

第一步:指定需要拆分的包,形成 DLL 库 – DllPlugin 第二步:告知webpack,命中 DLL 库文件 – DllReferencePlugin

Without DllPlugin

With DllPlugin

Build Time

16461ms - 17310ms

2991ms - 3505ms

DevServer Rebuild

2924ms - 2997ms

316ms - 369ms

– 引自 autodll-webpack-plugin

DllPlugin

此插件用于在单独的 webpack 配置中创建一个 dll-only-bundle。 此插件会生成一个名为 manifest.json 的文件,这个文件是用于让 DllReferencePlugin 能够映射到相应的依赖上。生成 manifest.json(实则就是一张映射表)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  entry: {
    vendor: ['axios', 'vue', 'vue-router', 'vuex']
  },
  output: {
    path: './public/dll',
    filename: '[name].js',
    // vendor.dll.js中暴露出全局变量名
    // 保持与webpack.DllPlugin中name一致
    library: '[name]_[hash]',
    publicPath: '/dll/'
  },
  plugins: [
    // manifest.json描述动态链接库包含了哪些内容
    new webpack.DllPlugin({
      path: path.resolve('./public/dll', '[name]-manifest.json'),
      // 保持与output.library中名称一致
      name: '[name]_[hash]',
      context: process.cwd()
    })
  ]
}

生成的 manifest.json 文件中,包含了从 require 和 import 中 请求到模块 id 的映射。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "./node_modules/.pnpm/axios@0.18.1/node_modules/axios/index.js": {
        "id": "./node_modules/.pnpm/axios@0.18.1/node_modules/axios/index.js",
        "buildMeta": {
            "providedExports": true
        }
    }
}

DllReferencePlugin

此插件配置在 webpack 的主配置文件中,此插件会把 dll-only-bundles 引用到需要的预编译的依赖中。

通过引用 dll 的 manifest 文件来把依赖的名称映射到模块的 id 上,之后再在需要的时候通过内置的 __webpack_require__ 函数来 require 对应的模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  plugins: [
    new webpack.DllReferencePlugin({
      context: process.cwd(),
      manifest: path.resolve('./public/dll', 'vendor-manifest.json')
    }),
    new AddAssetHtmlPlugin([
      {
         filepath: path.resolve('./public/dll', 'vendor.js'),
         typeOfAsset: 'js',
         publicPath: '/dll/'
      },
      {
        filepath: path.resolve('./public/dll', 'vendor.css'),
        typeOfAsset: 'css',
        publicPath: '/dll/'
      }
    ]),
  ]
}

遗留问题

通过上述配置构建速度得了提升,但其配置比较复杂。同时,会存在一些问题:

  1. 变更了包(新增、删除、版本),需要手动重新构建,生成 DLL
  2. Dev Server 模式下,资源都被加载到内存中,DLL 方式依然会从文件系统中读取

AutoDllPlugin

AutoDllPlugin 插件完美解决了上述问题,隐藏了大量配置的复杂性。

当第一次构建包时,AutoDllPlugin 会编译 DLL,并将包中的所有指定模块引用到 DLL;下次编译代码时,AutoDllPlugin 将跳过构建并改为从缓存中读取。每次更改插件配置、安装或删除节点模块时,AutoDllPlugin 都会重建 DLL。当使用 Webpack 的 Dev Server 时,bundle 被加载到内存中以防止从文件系统中进行不必要的读取。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plugins: [
  new HtmlWebpackPlugin({
    inject: true, // 将 main bundle 注入到 index.html
    template: './public/index.html',
  }),
  new AutoDllPlugin({
    inject: true, // 将 DLL bundle 注入到 index.html
    filename: '[name]_[hash].js',
    path: '/dll',
    entry: {
      vendor: ['axios', 'vue', 'vue-router', 'vuex']
    }
  })
]

AutoDllPlugin 有被 vue-cli 使用,所以可放心使用。

但在 vue-cli 引入 webpack4 之后,移除了该包,“因为 Webpack 4 的打包性能足够好的,dll 没有在 Vue ClI 里继续维护的必要了。”

dll option will be removed. Webpack 4 should provide good enough perf and the cost of maintaining DLL mode inside Vue CLI is no longer justified. – https://github.com/vuejs/vue-cli/issues/1205

HardSourceWebpackPlugin

AutoDllPlugin 其 github 仓库中,给出了重要提示。

HardSourceWebpackPlugin 为模块提供中间缓存步骤。 Webpack5 中已对该部分进行了官方实现

总结

按照上面的描述,我们应该摒弃 webpack dll 吗? 不然,webpack dll 除了提升构建速度,它还允许在不同项目之间共享代码(初衷)。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
你可能不知道的9条Webpack优化策略
本文以我自己的经验向大家分享如何通过一些分析工具、插件以及webpack新版本中的一些新特性来显著提升webpack的打包速度和改善包体积,学会分析打包的瓶颈以及问题所在。
前端森林
2020/07/24
1.8K0
性能优化篇---Webpack构建速度优化
const Jarvis = require("webpack-jarvis"); plugins: [ new Jarvis({ watchOnly: false, port: 3001 // optional: set a port }) ];
keyWords
2019/03/20
2.2K0
性能优化篇---Webpack构建速度优化
优化Webpack构建性能的几点建议
Webpack 作为目前最流行的前端构建工具之一,在 vue/react 等 Framework 的生态圈中都占据重要地位。在开发现代 Web 应用的过程中,Webpack 和我们的开发过程和发布过程都息息相关,如何改善 Webpack 构建打包的性能也关系到我们开发和发布部署的效率。 以下是一些关于优化 Webpack 构建性能的几点建议: 一、选择合适的 Devtool 版本 ​webpack 的 devtool 配置,决定了在构建过程中怎样生成 sourceMap 文件。通常来说eval的性能最高,但
葡萄城控件
2018/01/09
8880
优化Webpack构建性能的几点建议
优化Webpack构建性能的几点建议
Webpack 作为目前最流行的前端构建工具之一,在 vue/react 等 Framework 的生态圈中都占据重要地位。在开发现代 Web 应用的过程中,Webpack 和我们的开发过程和发布过程都息息相关,如何改善 Webpack 构建打包的性能也关系到我们开发和发布部署的效率。 以下是一些关于优化 Webpack 构建性能的几点建议: 一、选择合适的 Devtool 版本 ​webpack 的 devtool 配置,决定了在构建过程中怎样生成 sourceMap 文件。通常来说eval的性能最高,但
葡萄城控件
2018/06/21
7560
辛辛苦苦学会的 webpack dll 配置,可能已经过时了
如果大家看过一些 webpack 优化的文章,一定会出现 dll 动态链接库。它以配置之复杂让众多初学者记忆犹新。
卤代烃
2020/10/27
1.1K0
辛辛苦苦学会的 webpack dll 配置,可能已经过时了
Webpack中的高级特性
自从webpack4以后,官方帮我们集成了很多特性,比如在生产模式下代码压缩自动开启等,这篇文章我们一起来探讨一下webpack给我们提供的高级特性助力开发。
gogo2027
2022/10/21
5730
webpack性能优化之externals 与 DllPlugin
externals和DllPlugin都是为了分离模块诞生,通过他们可以将一些第三方模块抽离出来,打包的时候不需将某些三方库一起打包如vue、vue-router
切图仔
2022/09/08
8770
webpack性能优化之externals 与 DllPlugin
重学webpack4之构建速度提升和体积优化
5.执行npm run build,发现那些被拆分的包,没有打进业务代码中,符合预期
疯狂的技术宅
2020/12/15
1.2K0
重学webpack4之构建速度提升和体积优化
记一次webpack打包优化
未进行打包优化的痛点:   随着项目的不断扩大,引入的第三方库会越来越多,我们每次build的时候会对所有的文件进行打包,耗时必定很长,不利于日常开发。 解决思路:   第三方库我们只是引入到项目里来,一般不会经常性的去修改源码,一般都是在src目录下编写业务代码,因此可以把第三方依赖和src分开打包。   每次build的时候我们只需要把之前build好的第三方依赖文件引入到项目中即可,避免了我们每次build的时候都会build第三方依赖。   当第三方依赖发生改变的时候我们只需要把第三方依赖再buil
大当家
2018/06/28
1.4K1
vue-cli webpack2项目打包优化
减小文件搜索范围 配置 resolve.modules Webpack的resolve.modules配置模块库(即 node_modules)所在的位置,在 js 里出现 import 'vue' 这样不是相对、也不是绝对路径的写法时,会去 node_modules 目录下找。但是默认的配置,会采用向上递归搜索的方式去寻找,但通常项目目录里只有一个node_modules,且是在项目根目录,为了减少搜索范围,可以直接写明 node_modules 的全路径;同样,对于别名(`alias)的配置,亦当如此:
mcq
2018/06/20
1.3K0
webpack提升构建速度
前端项目随着时间推移和业务发展,页面可能会越来越多,或者功能和业务代码会越来越多,又或者依赖的外部类库会越来越多,这个时候原本不足为道的 webpack 构建时间消耗就会慢慢地进入我们的视野。
江拥羡橙
2023/11/13
5630
webpack提升构建速度
前端工程化之Webpack优化
好久没更文了,其实这段时间,一直没闲着。在准备一些比较重要的东西。忙着跑步,忙着学习,忙着xx。 总之就是,一直在忙着,从未停歇。
前端柒八九
2022/09/16
1.1K2
webpack的进阶使用
Webpack 是一个模块打包器,可以将多个模块打包成一个或多个文件。除了基本的打包功能外,Webpack 还提供了很多高级功能,可以优化打包结果、提高构建速度等。在本文中,我们将介绍 Webpack 的一些进阶使用技巧,并提供相应的代码示例。
世间万物皆对象
2024/03/20
870
一文彻底读懂webpack常用配置
const TerserPlugin = require('terser-webpack-plugin');
gogo2027
2022/10/18
4410
前端性能优化篇一:webpack性能优化
当我们不用cli,而是自己搭建项目架子的时候,会用到webpack构建我们的项目,在用webpack构建项目的时候,过长的打包编译时间和庞大冗余的代码会让我们感到头疼。所以优化webpack性能成为了不可或缺的一部分。下面我们一起来探讨webpack性能优化细节。
用户6835371
2021/06/01
2.2K0
前端性能优化篇一:webpack性能优化
加速 Webpack
作者:吴浩麟 https://www.ibm.com/developerworks/cn/web/wa-lo-expedite-webpack/index.html Web 应用日益复杂,相关开发技术也百花齐放,这对前端构建工具提出了更高的要求。 Webpack 从众多构建工具中脱颖而出成为目前最流行的构建工具,几乎成为目前前端开发里的必备工具之一。 大多数人在使用 Webpack 的过程中都会遇到构建速度慢的问题,在项目大时显得尤为突出,这极大的影响了我们的开发体验,降低了我们的开发效率。 本文将传授你一
企鹅号小编
2018/02/06
1.9K0
webpack实战——打包优化【中】
上篇从多线程打包和缩小打包作用域两个方面入手,对webpack打包层面做出优化。本篇描述从动态链接库思想方面继续深入探究打包层面的深度优化。
流眸
2020/11/06
8980
webpack 打包加速实战
OS: macOS High Sierra CPU: 2.6 GHz Intel Core i5 内存: 8G 1600 DDR3 硬盘: 1 TB SATA磁盘
李振
2021/11/26
5430
webpack的高阶使用
Webpack 是一款强大的模块打包工具,广泛应用于现代前端开发中。本文将从以下几个方面讨论 Webpack 的高阶使用方法:
世间万物皆对象
2024/03/20
980
webpack 学习笔记系列06-打包优化
可选值:async(默认) | initial | all(推荐),针对下面的 a.js 和 b.js
CS逍遥剑仙
2021/06/27
1.9K0
相关推荐
你可能不知道的9条Webpack优化策略
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文