资讯专栏INFORMATION COLUMN

Webpack DLL 配置教程

terro / 1745人阅读

摘要:原理文件又称为动态链接库文件,它通常作为应用程序可执行代码的一部分,供应用程序在运行时进行调用。优化以上程序只是为了快速入手与搭建,需要优化的地方还有很多,在此简单的列举几点,供大家参考。

原理

DLL文件又称为动态链接库文件,它通常作为应用程序可执行代码的一部分,供应用程序在运行时进行调用。

在Webpack中,内置的DllPlugin与DllReferencePlugin插件可以通过使用DLL来大幅提高构建性能,以下是DLL机制流程图:

初始化项目

为了便于实验,我们通过使用create-react-app创建项目并eject出webpack配置:

npx create-react-app react-dll-demo
cd react-dll-demo && npm run eject

由于默认配置隐藏了编译信息,打开webpackDevServer.config.js,将quiet: true改为false,再启动一下项目,找出我们需要的信息:

Version: webpack 4.28.3
Time: 6985ms
Built at: 2019-02-21 10:46:42
                         Asset       Size        Chunks             Chunk Names
           asset-manifest.json  232 bytes                [emitted]
                    index.html   1.65 KiB                [emitted]
          static/js/0.chunk.js   4.21 MiB             0  [emitted]
           static/js/bundle.js   30.9 KiB  runtime~main  [emitted]  runtime~main
       static/js/main.chunk.js   47.4 KiB          main  [emitted]  main
static/media/logo.5d5d9eef.svg   2.61 KiB                [emitted]
DLLPlugin

首先在package.json的scripts字段添加一条脚本:

{
  "build:dll": "webpack --config config/webpack.dll.config.js --mode production"
}

然后创建配置文件:

// config/webpack.dll.config.js

const webpack = require("webpack");
const path = require("path");

module.exports = {
  entry: {
    react: ["react", "react-dom"]
  },
  output: {
    filename: "[name].dll.js",
    path: path.join(__dirname, "../public/dll"),
    libraryTarget: "var",
    library: "_dll_[name]_[hash]"
  },
  plugins: [
    new webpack.DllPlugin({
      path: path.join(__dirname, "../public/dll", "[name].manifest.json"),
      name: "_dll_[name]_[hash]"
    })
  ]
};

执行npm run build:dll,CLI应该会自动提示你安装webpack-cli,运行完成后可以看到以下文件:

public/dll
├── react.dll.js
└── react.manifest.json
DLLReferencePlugin

打开config/webpack.config.js,在根对象plugins字段中写入该插件:

{
  plugins: [
    // ...
    new webpack.DllReferencePlugin({
        manifest: require(path.join(
        __dirname,
        "../public/dll/react.manifest.json"
        ))
    }),
  ]
}

最后一个步骤,在index.html我们先手动引入dll依赖:

    ...
    
...

此时重新运行程序,等待项目正常运行,再检查一下编译信息:

Version: webpack 4.28.3
Time: 4883ms
Built at: 2019-02-21 11:19:11
                         Asset       Size        Chunks             Chunk Names
           asset-manifest.json  232 bytes                [emitted]
                    index.html   1.69 KiB                [emitted]
          static/js/0.chunk.js   1.82 MiB             0  [emitted]
           static/js/bundle.js   30.9 KiB  runtime~main  [emitted]  runtime~main
       static/js/main.chunk.js   52.1 KiB          main  [emitted]  main
static/media/logo.5d5d9eef.svg   2.61 KiB                [emitted]

很显然的看到,在development模式下,构建时间降低了2s,打包大小降低了2.4M,相信将DLL运用到项目工程中,你能收获到更多的惊喜。

优化

以上程序只是为了快速入手与demo搭建,需要优化的地方还有很多,在此简单的列举几点,供大家参考。

自动注入编译文件到HTML

通过安装html-webpack-include-assets-plugin插件,可以自动将相应文件注入到index.html中,就可以避免手动进行更改了:

// config/webpack.config.js
const HtmlIncludeAssetsPlugin = require("html-webpack-include-assets-plugin");
// ...
{
  plugins: [
    new HtmlIncludeAssetsPlugin({
      assets: ["dll/react.dll.js"],
      append: false // 在其他资源前添加
    }),
  ]
}
DLL的缓存问题与自动加载

我们通常不会对html文件做缓存,每次发版本时采用增量发布,只要html的依赖文件名变了,则会重新去解析静态资源列表。除此之外,还需要提供一个函数,自动去加载文件夹内的多入口dll文件,以下为核心代码:

config/dllHelper.js:

// config/dllHelper.js
const webpack = require("webpack");
const path = require("path");
const fs = require("fs");
const dllConfig = require("./webpack.dll.config");

// 根据entry生成DllReferencePlugin列表
function genDllReferences() {
  return Object.keys(dllConfig.entry).map(
    name =>
      new webpack.DllReferencePlugin({
        manifest: require(path.join(
          __dirname,
          "../public/dll",
          `${name}.manifest.json`
        ))
      })
  );
}

// 生成dll文件的静态资源路径
function loadDllAssets() {
  return fs
    .readdirSync(path.resolve(__dirname, "../public/dll"))
    .filter(filename => filename.match(/.dll.js$/))
    .map(filename => `dll/${filename}`);
}

module.exports = {
  loadDllAssets,
  genDllReferences
};

config/webpack.dll.config.js:

// 
{
  ...
  output: {
    filename: "[name].[hash:8].dll.js"
  }
}

config/webpack.config.js:

const dllHelper = require("./dllHelper");
...
{
  plugins: [
    ...dllHelper.genDllReferences(),
    new HtmlIncludeAssetsPlugin({
      assets: dllHelper.loadDllAssets(), 
      append: false
    })
  ]
}
构建前清空文件夹

若DLLPlugiun的entry发生变化,则dll内的文件可能会越来越多,因此我们需要在构建dll前清空文件夹,在这里推荐这两个package:

npm-run-all,在scripts可串行或并行执行script

rimraf,nodejs删除文件利器

首先安装相应依赖:yarn add -D rimraf npm-run-all,然后修改package.json:

scripts: {
  "make:dll": "npm-run-all clear:dll build:dll",
  "build:dll": "webpack --config config/webpack.dll.config.js --mode production",
  "clear:dll": "rimraf public/dll",
}

之后在变动DLL时,一定要记得执行:npm run make:dll

其他

Demo仓库地址:GitHub - vv13/react-dll-demo

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/101968.html

相关文章

  • Vue-cli3 简qian易yi教程

    摘要:原文地址对于没有了解过的童鞋,建议先去看看官方的教程传送门新版本的新特性插件使用的插件,可以很快的搭建一个项目的结构。使用时直接引入即可。的界面让管理项目变得更加简单。如迁移过程中有任何疑问,可以留言一起探讨。 原文地址 对于没有了解过 vue-cli3 的童鞋,建议先去看看官方的教程: 传送门 新版本的新特性 1. 插件 使用 cli 的插件,可以很快的搭建一个项目的结构。如 ax...

    jemygraw 评论0 收藏0
  • webpack dll打包重复问题优化

    摘要:关于的使用,我这里不做过多介绍,网上都有,一撸一大把,今天我要说的是在使用过程中出现的一个包依赖问题,这个问题导致打出来的包会包含重复的代码。 关于webpack dll的使用,我这里不做过多介绍,网上都有,一撸一大把,今天我要说的是在使用dll plugin过程中出现的一个包依赖问题,这个问题导致打出来的包会包含重复的代码。 优化背景 最近在给公司项目优化的时候,由于内部CDN上传文...

    NicolasHe 评论0 收藏0
  • webpack多页应用架构系列(十一):预打包Dll,实现webpack音速编译

    摘要:本文首发于的技术博客实用至上,非经作者同意,请勿转载。原文地址如果您对本系列文章感兴趣,欢迎关注订阅这里前言书承上文多页应用架构系列十如何打造一个自定义的。终于,发现了这一大杀器,打包时间过长的问题得到完美解决。 本文首发于Array_Huang的技术博客——实用至上,非经作者同意,请勿转载。原文地址:https://segmentfault.com/a/119000000710437...

    sixleaves 评论0 收藏0
  • vue-cli配置webpack dll

    摘要:一缓存失效改变了的一点儿代码,打包的就会改变导致每次发布,的缓存都会失效。为了解决上述问题,在网上查找资料后,找到使用这个方案。三对比结果优化前笔记本上打包时间为,优化后笔记本打包时间为,同时也增加了这些库的缓存。 问题 在前端项目中,我们希望第三方库(vendors)和自己写的代码可以分开打包,vue-cli也帮我们配好了webpack的CommonsChunkPlugin,但是在使...

    justCoding 评论0 收藏0
  • vue-cli配置预编译

    摘要:转载文章公司的平台功能越堆越多,打包也越来越费劲,一次十几分钟,运维很不爽,捣鼓了一下预编译,试了一下大概缩短了七八分钟,目前感觉还行,现在把它记下来,给需要的童鞋当做参考,也给自己记录一下。 (转载文章)公司的平台功能越堆越多,打包也越来越费劲,一次十几分钟,运维很不爽,so捣鼓了一下预编译,试了一下大概缩短了七八分钟,目前感觉还行,现在把它记下来,给需要的童鞋当做参考,也给自己记录...

    KnewOne 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<