利用webpack-chain配置happypack和DllReferencePlugin

利用webpack-chain配置happypack和DllReferencePlugin好久不发博文 最近主要是攻考试去了 积累的几篇文章都懒得写 今天抽空写一下 webpack 的打包优化 由于我的框架是基于 vue admin template 做的 框架用的是 webpack chain 命令做的 所以也导致了我做 webpack 优化走了不少弯路 我的优化主要做了 happypack 多线程打包和 DllReference 抽离依赖库 1 先介绍 happypack 的步骤 1 安装相关插件 os 和 happypack 安装的命令根据自己喜欢 我用的是 yarnaddos 和 yarn

好久不发博文,最近主要是攻考试去了,积累的几篇文章都懒得写。

今天抽空写一下webpack的打包优化,由于我的框架是基于vue-admin-template做的,框架用的是webpack-chain命令做的,所以也导致了我做webpack优化走了不少弯路。

我的优化主要做了happypack多线程打包和DllReferencePlugin抽离依赖库。

1、先介绍happypack的步骤

(1)安装相关插件,os和happypack,安装的命令根据自己喜欢,我用的是yarn add osyarn add happypack

(2)开始引入依赖,在vue.config.js引入相关依赖,如图:

利用webpack-chain配置happypack和DllReferencePlugin

(3)引入之后开始在chainWebpack(config){}里面写相关代码,如图:

利用webpack-chain配置happypack和DllReferencePlugin

代码如下:

config.plugin('happypack') .use(HappyPack) .tap(options => { options[0] = { id: 'babel', // 如何处理 用法和loader 的配置一样 loaders: ['babel-loader?cacheDirectory=true'], // 共享进程池 threadPool: happyThreadPool } return options }) const hRule = config.module.rule('js') hRule.test(/\.js$/) .include.add(resolve('src')) .end() hRule.uses.clear() hRule.use('happypack/loader?id=babel') .loader('happypack/loader?id=babel') .end()

这里需要注意的是一定要记得定义一下,const hRule = config.module.rule(‘js’) 再进行过滤和匹配,如果直接在config.module.rule(‘js’).test(/\.js$/).include.add(resolve(‘src’)) .end()是不对的,有可能是不报错又不生效的,有的是打包正式环境会报错,我的会报错,具体错误如下:

利用webpack-chain配置happypack和DllReferencePlugin

这个错误是我百度了不少案例,然后结合自己的需要才找到正确的写法的,希望大家不要跟我一样犯这个错误。参考链接是这位小哥的:https://blog.csdn.net/weixin_/article/details/

以上就是多线程打包的代码优化,下面是DllReferencePlugin抽离依赖库的优化

2、下面是DllReferencePlugin的优化,这个优化一波三折,三次停工去做别的,最后是挤时间搞定的。我做这个主要参考https://www.geekjc.com/post/5d7f901fb4f5e60da8f3e628这个博客写的,他写得很全,但我按照写法是有bug的。下面是我的步骤。

(1)先将相关插件下载,用到是add-asset-html-webpack-plugin和clean-webpack-plugin,我用的是yarn add add-asset-html-webpack-plugin,yarn add clean-webpack-plugin喜欢用npm的可以用npm。

(2)引入依赖,如图:

利用webpack-chain配置happypack和DllReferencePlugin

然后安装完之后就可以写代码啦,

(3)首先写要分离的包,在vue.config.js同级目录下新建webpack.dll.config.js文件,目录图如下:

利用webpack-chain配置happypack和DllReferencePlugin

(4)文件内容如下(主要抽你经常不变的依赖库出来,我的库不变的主要有以下几个,所以就打包了以下几个):

const path = require('path') // const CleanWebpackPlugin = require('clean-webpack-plugin') const { CleanWebpackPlugin } = require('clean-webpack-plugin') const webpack = require('webpack') module.exports = { mode: 'production', entry: { vendor: ['vue/dist/vue.runtime.esm.js', 'vuex', 'vue-router', 'element-ui', 'echarts', 'vue-count-to', 'xlsx'], util: ['lodash'] }, output: { filename: '[name].dll.js', path: path.resolve(__dirname, 'dll'), library: 'dll_[name]' }, plugins: [ new CleanWebpackPlugin(), // clean-wepback-plugin目前已经更新到2.0.0,不需要传参数path new webpack.DllPlugin({ name: 'dll_[name]', path: path.join(__dirname, 'dll', '[name].manifest.json'), context: __dirname }) ] } 

(5)在package.json写一个命令 “build:dll”: “webpack –config webpack.dll.config.js”,如图:

利用webpack-chain配置happypack和DllReferencePlugin

(6)写好命令之后在终端运行以下这个命令生成dll文件夹,如图:

利用webpack-chain配置happypack和DllReferencePlugin

(7)运行完6的命令后生成一个dll文件夹,到这儿离成功就剩一半了,但恰恰是这一半耗了我很长的时间。下面是写代码合并进去的时候,在vue.config.js里面写相关代码。如图:

利用webpack-chain配置happypack和DllReferencePlugin

利用webpack-chain配置happypack和DllReferencePlugin

代码如下:

const dllReference = (config) => {
  config.plugin('vendorDll')
    .use(webpack.DllReferencePlugin, [{
      context: __dirname,
      manifest: require('./dll/vendor.manifest.json')
    }])

  config.plugin('utilDll')
    .use(webpack.DllReferencePlugin, [{
      context: __dirname,
      manifest: require('./dll/util.manifest.json')
    }])

  config.plugin('addAssetHtml')
    .use(AddAssetHtmlPlugin, [
      [
        {
          filepath: require.resolve(path.resolve(__dirname, 'dll/vendor.dll.js')),
          outputPath: 'dll',
          publicPath: 'dll'
        },
        {
          filepath: require.resolve(path.resolve(__dirname, 'dll/util.dll.js')),
          outputPath: 'dll',
          publicPath: 'dll'
        }
      ]
    ])
    .after('html')
}




 chainWebpack(config) {
    config.plugins.delete('preload') // TODO: need test
    config.plugins.delete('prefetch') // TODO: need test
    if (process.env.NODE_ENV === 'production') {
      dllReference(config)
    }
 }

(8)到这打包就完成了。我试着打包,发现报错了,报什么错呢,报Uncaught ReferenceError: _dll_vendor is not defined,我一百度,有个博主有遇到这个问题,说是未在webpack.dll.config.js中 new DllPlugin({})内未配置context。我看看我的代码我内配置了啊,我的问题不是这个,然后找了很久发现了问题

主要是在vue.config.js里面的config.plugin(‘addAssetHtml’)的publicPath: ‘dll’到底应该是怎么样的,因为原博客是publicPath: ‘/dll’,我按照他的写法丢上服务器是报错的。然后看了一下是因为我们的module.exports = { publicPath: ‘./’}是不一样的,我的是相对路径他的是绝对路径module.exports = { publicPath: ‘/’}所以它需要/dll而我不需要,我只需要写dll’。处理完之后打包,清除缓存运行,起来了,啊,一把辛酸泪啊!

注意:如果你路径写不对了,更新完之后,请先清缓存,清缓存很重要,并且后台丢包上去之后,你要等会。我就是因为不等或者是因为忘记清缓存,导致我很多次已经成功了,但是页面上还是报错。我又要不停试别的方法,导致多耗了几个小时的时间。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176804.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午9:00
下一篇 2026年3月26日 下午9:00


相关推荐

  • 卡片式电脑介绍

    卡片式电脑介绍

    2021年11月13日
    85
  • 从数据库中读取,实现省市区联动

    从数据库中读取,实现省市区联动

    2021年8月21日
    61
  • ping命令详解 ping命令入门详解

    ping命令详解 ping命令入门详解在这个时代,科技越来越发达,网络已经越来越成为人们不可缺少的一部分。计算机也已经是很多学校的课程了,因为计算机技术是非常有技术性的专业,它其中涉及到很多专业知识,需要通过学习才能掌握。今日小编就为大家介绍一个计算机的命令,它叫做Ping,这边介绍一下它的入门知识,主要是关于ping连接和命令方面的介绍。  1、Ping的基础知识  ping命令相信大家已经再熟悉不过了,但是能把ping的功能发…

    2026年2月18日
    9
  • 加多宝为什么会输给王老吉_加多宝王老吉占比

    加多宝为什么会输给王老吉_加多宝王老吉占比如果评选世界营销战最激烈案例,2012年爆发的王老吉与加多宝之间的品牌大战一定榜上有名。那是一场由一个小小红罐引发的“血战”。一、缘起加、王之争的来龙动脉我就不细说了,大概起因是若干年前国企广药将其旗下的传统凉茶品牌“王老吉”部分(红罐)租给了与王老吉凉茶创始者后人有关的香港鸿道集团旗下的加多宝集团。这种做法本来十分普遍没啥特别,但没想到的是加多宝的市场运作能力超强,竟然在短短几年内将一种原来…

    2025年7月15日
    5
  • js split 正则分割字符串

    js split 正则分割字符串正则表达式分割字符串 str split s 中间加多个分割符 s 为空格转义 HelloWorld I amcode split s Hello World I am code Earth is ourhome split s Earth is our home This is a sentence split s Thi

    2026年3月17日
    2
  • RNN详解(Recurrent Neural Network)

    RNN详解(Recurrent Neural Network)一 概述 RNN 用于处理序列数据 在传统的神经网络模型中 是从输入层到隐含层再到输出层 层与层之间是全连接的 每层之间的节点是无连接的 但是这种普通的神经网络对于很多问题却无能无力 例如 你要预测句子的下一个单词是什么 一般需要用到前面的单词 因为一个句子中前后单词并不是独立的 RNN 之所以称为循环神经网路 即一个序列当前的输出与前面的输出也有关 具体的表现形式为网络会对前面的信息进行记忆并应用

    2026年3月26日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号