本文提供使用externalsDllPlugin优化webpack编译的大体思路,它们的基本思想是将依赖的框架等模块从构建过程中移除,进而提高打包速度以及减小打包产物的体积,具体的操作可以自行查阅。

通过webpack-bundle-analyzer插件查看webpack项目打包的结果(插件的使用方式见这:Webpack Bundle Analyzer):

鼠标悬停浏览器左侧还可以看到各个包的具体大小以及一些选项:

从可视化树图中我们可以清晰地看出各个模块打包结果,那么我们就可以抓主要矛盾处理:发现userCenter.bundle.js包体积最大,那就拿他来开刀。

原始未优化(userCenter.bundle.js:7.55 MB):

可以看到ag-grid-communityBizChats.js这两个第三方库所占体积较大,每次构建都将它们打包进去是不合理的。

我们通过webpack的externals配置项从输出的 bundle 中排除排除对ag-grid-community的依赖(配置方式见:externals),简而言之,就是以下:

  1. 配置webpack.config.js文件:externals : { 'ag-grid-community': 'agGrid' }
  2. 在自己的html页面添加对应包的script标签将包导入:例如在开发环境中
    <script src="../node_modules/ag-grid-community/dist/ag-grid-community.min.js"></script>
    

打包后(userCenter.bundle.js:5.84 MB,减少22.6%):

这里我们已经将ag-grid-community包从bundle中移除,接着继续处理BizChats.js

通过DllPlugin(配置方式见这里:DllPlugin)单独打包bizcharts。webpack dll配置文件的一个例子,具体如下:

  1. 配置webpack.dev.dll.config.js文件用于打包外部库(DllPlugin插件会生成一个名为 manifest.json 的文件,这个文件是用于让 DllReferencePlugin插件能够映射到相应的依赖上):

    const webpack = require('webpack');
    const path = require('path')
    module.exports = {entry: {"vendor" : ['es6-promise','whatwg-fetch','classnames','moment','core-js/es6/map','core-js/es6/set','raf/polyfill','react','react-dom','bizcharts']},mode : 'development',resolve: {modules: [path.join(__dirname, "src"), "node_modules"]},output: {path: path.join(__dirname, './dlls'),filename: '[name].js',library: '[name]'},plugins: [new webpack.DllPlugin({path: path.join(__dirname, './dlls/[name].json'),name: '[name]'})]
    };
    
  2. 在package.json中添加scripts:
     "dll": "cross-env NODE_ENV=development webpack --config webpack.dev.dll.config.js",
    
  3. 在项目打包的webpack配置文件中的plugins配置项添加DllReferencePlugin插件:
    plugins: [new webpack.DllReferencePlugin({context: __dirname,manifest: require('./dlls/vendor.json'),})
    ],
    
  4. 再运行npm脚本npm run dll,即可生成我们的打包产物
  5. 正常启动项目即可。

打包后(userCenter.bundle.js:4.31 MB,减少20.3%):

经过这两次第三方库的抽离,userCenter.bundle.js模块从7.55M降低到4.31M,缩减了42.9%,项目整体从39.24M降低到34.3M,缩减了12.9%,效果还是立竿见影的。其他模块需要处理的话,同理。

Webpack 配置中的 externalsDllPlugin 解决的是同一类问题:将依赖的框架等模块从构建过程中移除。它们的区别在于:
6. 在 Webpack 的配置方面,externals 更简单,而 DllPlugin 需要独立的配置文件。
7. DllPlugin 包含了依赖包的独立构建流程,而 externals 配置中不包含依赖框架的生成方式,通常使用已传入 CDN 的依赖包。
8. externals 配置的依赖包需要单独指定依赖模块的加载方式:全局对象、CommonJS、AMD 等。
9. 在引用依赖包的子模块时,DllPlugin 无须更改,而 externals 则会将子模块打入项目包中。

webpack编译提速:使用externals和DllPlugin相关推荐

  1. webpack编译时No PostCSS Config的解决方法

    1. {loader:"postcss-loader",options: { // 如果没有options这个选项将会报错 No PostCSS Config foundplugi ...

  2. vue中webpack编译打包使用之Vue知识点归纳(十一)

    本文中将描述 webpack 简述 webpack 项目的初始化配置 webpack 打包运行一个 vue 项目 1 什么是webpack,到底需要解决什么问题 近几年前端的快速发展,前端已不是简单的 ...

  3. 关于webpack编译scss文件

    css加载器文件通常和extract-text-webpack-plugin一块使用,我们可以在源文件src目录下写scss文件,然后通过webpack编译成css文件到输出目录public,这个目录 ...

  4. webpack 编译stylus_webpack 文档更新日志(9.129.29)

    久等了,本应上周五发的更新日志,现在才来.话不多说,开始正题. 英文篇 内容更新 API loader 中移除了对 this.exec 的说明 module-methods 中新增了 webpack ...

  5. webpack 编译stylus_webpack 文档更新日志(9.12-9.29)

    久等了,本应上周五发的更新日志,现在才来.话不多说,开始正题. 英文篇 内容更新 API loader 中移除了对 this.exec 的说明 module-methods 中新增了 webpack ...

  6. webpack 编译html模板文件

    1.项目结构 安装loader: npm i html-loader --save-dev npm i ejs-loader --save-dev 2.模板文件layer.html <div c ...

  7. webpack编译过程

    webpack的作用是将源代码编译(构建.打包)成最终代码.整个过程大致分为三个步骤:初始化.编译.输出. 1.初始化 在该阶段,webpack会将CLI参数.配置文件.默认配置进行融合,形成一个最终 ...

  8. windows 编译 caffe unresolved externals 问题

    windows 10 编译基于 caffe 的工程, 由于github上作者所用到的版本各不相同,版本是导致问题的根本. 遇到 LNK20xx error unresolved externals,先 ...

  9. webpack 编译完成执行代码

    接收一个项目,由于目录结构的问题,每次编译完成后就需要去修改编译后的 HTML 文件中引用的其它文件的路径. 所以想在编译完成后使用 node 来操作文件修改路径. 然后在 webpack 官网找到了 ...

最新文章

  1. 小区的足球场地实地拍摄
  2. 定位相关论文-A Novel Pedestrian Dead Reckoning Algorithm for Multi-Mode Recognition Based on Smartphones
  3. 如何复制带格式的Notepad++文本?
  4. 世界hack杂志集合(转)
  5. 面向对象的程序设计在游戏开发中使用(一):类
  6. SQL编程---存储过程和存储函数
  7. Silverlight反编译系列二常见代码(自动生成属性CompilerGenerated,代码)
  8. Fiddler如何查找登陆的可用cookie用于其他请求?方式一
  9. 测试想要月薪过万?这些能力必不可少!
  10. H.248-Transcoding与Interception
  11. SharePoint 2010 获取列表全部定义方法
  12. 慕课软件质量保证与测试(第十章.课后作业)
  13. 图像特征提取(二)——SIFT算法详解
  14. 爬虫爬取东方财富网的股票走势图
  15. 关于命令执行Bypass的一些思路
  16. 硬盘安装archlinux
  17. thinkphp 邮箱配置完美测试
  18. js字符串基本数据类型
  19. 笔记本电脑安装CentOS7
  20. 飞机大战代码(高仿),完美复原原游戏,好玩到停不下来

热门文章

  1. 我最怕30岁以后,还要靠投简历找工作
  2. Retinize:iOS切图神器
  3. 线程安全与可重入函数的区别与联系
  4. 基于Java毕业设计校园疫情防控管理软件源码+系统+mysql+lw文档+部署软件
  5. 基于PyQt5的YOLOv5检测界面——YOLOv5检测目标后声音告警的美化
  6. 数字孪生在新型智慧医疗建设中的应用
  7. 年龄焦虑总是来得猝不及防
  8. spring mvc + ibatis + Oracle + ajax 轻量级架构搭建及详解
  9. C++堆内存空间详解(释放内存、内存泄露)
  10. 解决input框添加圆角后边框变粗