DLL(Dynamic Link Library)动态链接库在 webpack 中用来将可共享且不常改变的代码抽取成公共的库。

没有使用 DLL

reactreact-dom 在 react 项目中是必备的两个库,把它们抽取出来单独打个包。

首先进行安装 npm install react react-dom --save

在 src 目录下新建 index.jsx 文件,编写 react 代码

import React, { Component } from 'react';
export default class App extends Component {
  state = {
    message: 'hello react ',
  };
  render() {
    return <div>{this.state.message}</div>;
  }
}

在一层级的 index.js 中引入 react 组件,并安装 axios 后使用它来发送一个请求

import React from 'react';
import ReactDOM from 'react-dom';
import App from './app.jsx';
import axios from 'axios'; ReactDOM.render(<App />, document.getElementById('container'));
axios.get('https://httpbin.org/get').then((res) => {
  console.log('res', res);
});

react 代码需要通过 babel 进行处理,可以参考 这篇文章,在没有使用 DLL 的时候,第三方库 react react-domaxios 都被打包到了 702.js 文件中。

打包DLL库

如果需要对某些资源单独打包,就可以使用到 DLL,新建 webpack.dll.js 文件,自定义编译规则,通过 DllPlugin 生成 manifest.json文件,其中包含依赖的映射关系。

const { DllPlugin } = require('webpack');
const path = require('path'); module.exports = {
  entry: {
    react: ['react', 'react-dom'],
  },
  output: {
    filename: './[name].js',
    path: path.resolve(process.cwd(), './dll'),
    library: '[name]',
  },
  plugins: [
    new DllPlugin({
      name: '[name]',
      path: path.resolve(__dirname, './dll/manifest.json'),
    }),
  ],
};

执行 npx webapck --config ./webpack.dll.js 后,生成三个文件,mainfest.jsonreact.js 和一个注释文件(可通过TerserPlugin去除)

如果此时直接编译 webpack.config.js 文件的话,reactreact-dom还是会被作为第三方库和 axios 编译到一起。

引入DLL库

虽然已经通过 DLLreactreact-dom 自行打包了,但是没有告诉 webpack.config.js 不需要再把这两者打包到公共的库中。这时候请出 DllReferencePlugin 来处理。

const { DllReferencePlugin } = require('webpack');

module.exports = {
// 其它配置省略
  plugins: [
    new DllReferencePlugin({
      manifest: path.resolve(process.cwd(), './dll/manifest.json'),
context: path.resolve(process.cwd(), './'),
    }),
  ],
};

此时第三方库的 js 文件里已经没有了 reactreact-dom,文件名由 702.js 变成了 559.js 是因为内容发生了变化。

运行编译后的 index.html 文件,发现报错 react is not defined,也没有在页面中显示 hello react 的代码。

将文件添加到 html 中

这是因为第三库打包的 js 文件中排除了 react react-dom ,自行打包的 react.js 又没有被引入到 html 文件中,所以执行的时候就找不到文件了。

安装插件 add-asset-html-webpack-plugin ,通过它来引入文件到 html 中

const AddAssetHtmlWebpackPlugin = require('add-asset-html-webpack-plugin');

module.exports = {
  // 其它配置省略
  plugins: [
    new AddAssetHtmlWebpackPlugin({
      filepath: path.resolve(process.cwd(), './dll/react.js'),
      outputPath: './auto',
    }),
  ],
};

这样通过 DLL 编译的 react.js 文件就被引入到 html 文件中,页面也能正常显示

总结

使用 DLL 可以自定义打包的内容,分为以下三个步骤。

  • webpack.dll.js 中使用 DllPlugin 生成 mainfest.json 和 js 文件
  • webpack.config.js 中使用 DllReferencePlugin 去 mainfest.json 文件中找到映射关系,排除不需要打包的库
  • webpack.config.js 中通过 add-asset-html-webpack-plugin 在 html 文件引入资源

以上是关于使用 DLL 打包的总结, 更多有关 webpack 的内容可以参考我其它的博文,持续更新中~

大数据请把文章推给想了解DLL的人的更多相关文章

  1. 大数据de 2文章

    点击可免费试用网易有数 文章来源:网易有数的搭积木原则阐述 ,经作者文雯授权发布 wo ceceshi 相关文章:[推荐] SpringBoot入门(五)--自定义配置

  2. 谦先生的程序员日志之我的hadoop大数据生涯一

    从一个初级程序员到高级程序员的经历 你好!我是谦先生,我是茫茫程序猿中的一猿,平凡又执着. 刚入行的时候说实话,啥都不懂,就懂点皮毛的java,各种被虐狗的感觉.又写js又写css又写后台...慢慢被 ...

  3. 面试系列二:精选大数据面试真题JVM专项-附答案详细解析

    公众号(五分钟学大数据)已推出大数据面试系列文章-五分钟小面试,此系列文章将会深入研究各大厂笔面试真题,并根据笔面试题扩展相关的知识点,助力大家都能够成功入职大厂! 大数据笔面试系列文章分为两种类型: ...

  4. 大数据时代,IT行业竟有如此多高薪职位!

    近年来云计算.大数据.BYOD.社交媒体.3D打印机.物联网……在互联网时代,各种新词层出不穷,令人应接不暇.这些新的技术.新兴应用和对应的IT发展趋势,使得IT人必须了解甚至掌握最新的IT技能. 另 ...

  5. 一台虚拟机,基于docker搭建大数据HDP集群

    前言 好多人问我,这种基于大数据平台的xxxx的毕业设计要怎么做.这个可以参考之前写得关于我大数据毕业设计的文章.这篇文章是将对之前的毕设进行优化. 个人觉得可以分为两个部分.第一个部分就是基础的平台 ...

  6. JAVA开发搞了一年多的大数据,究竟干了点啥

    JAVA开发搞了一年多大数据的总结 ​ 2021年7月份加入了当前项目组,以一个原汁原味的Java开发工程师的身份进来的,来了没多久,项目组唯一一名大数据开发工程师要离职了,一时间一大堆的数据需求急需 ...

  7. 跟上节奏 大数据时代十大必备IT技能(转)

    新的想法诞生新的技术,从而造出许多新词,云计算.大数据.BYOD.社交媒体……在互联网时代,各种新词层出不穷,让人应接不暇.这些新的技术,这些新兴应用和对应的IT发展趋势,使得IT人必须了解甚至掌握最 ...

  8. 跟上节奏 大数据时代十大必备IT技能

    跟上节奏 大数据时代十大必备IT技能 新的想法诞生新的技术,从而造出许多新词,云计算.大数据.BYOD.社交媒体……在互联网时代,各种新词层出不穷,让人应接不暇.这些新的技术,这些新兴应用和对应的IT ...

  9. 大数据学习总结(7)we should...

    大数据场景一.各种标签查询 查询要素:人.事.物.单位 查询范围:A范围.B范围.... 查询结果:pic.name.data from 1.痛点:对所有文本皆有实时查询需求2.难点:传统SQL使用W ...

  10. 分析 BAT 互联网巨头在大数据方向布局及大数据未来发展趋势

    > 风起云涌的大数据战场上,早已迎百花齐放繁荣盛景,各大企业加速跑向"大数据时代".而我们作为大数据的践行者,在这个"多智时代"如何才能跟上大数据的潮流, ...

随机推荐

  1. springMVC中注解

    其中常见注解: 1.@RequestMapping:用于请求url路径,可用于类和方法上,用于类上,则表示类中所有响应请求的方法都是以该路径作为父路径. 2.@RequestBody:注解实现接收 h ...

  2. css设置单行多行超出显示省略号

    单行: width: 200px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; 多行: text-overflow: ...

  3. 2023-03-02:给定一个数组arr,长度为n, 任意相邻的两个数里面至少要有一个被选出来,组成子序列,才是合法的! 求所有可能的合法子序列中,最大中位数是多少? 中位数的定义为上中位数, [1,

    2023-03-02:给定一个数组arr,长度为n, 任意相邻的两个数里面至少要有一个被选出来,组成子序列,才是合法的! 求所有可能的合法子序列中,最大中位数是多少? 中位数的定义为上中位数, [1, ...

  4. 2022-09-17:一个字符串s,表示仓库的墙 与 货物,其中‘|‘表示墙,‘*‘表示货物。 给定一个起始下标start和一个终止下标end, 找出子串中 被墙包裹的货物 数量。 比如: s = “

    2022-09-17:一个字符串s,表示仓库的墙 与 货物,其中'|'表示墙,''表示货物. 给定一个起始下标start和一个终止下标end, 找出子串中 被墙包裹的货物 数量. 比如: s = &q ...

  5. pages.json 文件:globalStyle 全局配置

    globalStyle 用于设置应用的状态栏.导航条.标题.窗口背景色等. 属性 类型 默认值 描述 平台差异说明 navigationBarBackgroundColor HexColor #F7F ...

  6. UCOS II源码分析二

    最近大家都沉浸在找到实习的快乐中,自我充电的时间相对减少了,今天重拾一下ucosii的学习,记录如下: 上一篇文章分析了ucosii源码文件组织结构以及简单介绍了各个文件夹里对应文件的功能,要是对uc ...

  7. vst实例(2) 创建VST

    前面我们知道,创建一个虚拟树,应该首先告知VST节点数据的大小(即nodedatasize),其实在创建树结构时,这一点并不是必须的,而是如果你需要让VST的每一个节点能指向一定的数据,从而在执行树的 ...

  8. Java的Object类的方法

    Java的Object类是所有类的根类,它提供了一些通用的方法.下面是一些常用的Object类方法: 1. equals(Object obj):判断当前对象是否与给定对象相等.默认情况下,equal ...

  9. 文盘Rust -- tokio绑定cpu实践

    tokio 是 rust 生态中流行的异步运行时框架.在实际生产中我们如果希望 tokio 应用程序与特定的 cpu core 绑定该怎么处理呢?这次我们来聊聊这个话题. 首先我们先写一段简单的多任务 ...

  10. tryhackme-OWASP

    tryhackme-OWASP Top 10部分记录 敏感信息泄露 在assets目录中 可以看到到一个sqlite数据库的webapp.db文件 使用sqlite3 webapp.db .table ...