问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

使用vue-cli,热替换不起作用怎么办

发布网友 发布时间:2022-04-21 09:48

我来回答

1个回答

热心网友 时间:2023-11-09 03:53


这次给大家带来怎么提速优化vue-cli的代码,提速优化vue-cli代码的注意事项有哪些,下面就是实战案例,一起来看一下。
前言

伴随着vue的全球化,已经各种vue的组件框架越来越完善,从早期的element-ui到vux,iview等越来越多高质量的项目,使用vue进行前端构建已然是一件工程化,模块化,敏捷化的事情

在这其中,相信很多人都会选择官方的vue-cli初始化工程模板,然后通过引入第三方组件框架和工具的方式进行开发构建,我个人也十分推崇这种做法。但是vue-cli初始化的项目模板毕竟是面向所有开发者的,在兼容性方面会有一定妥协。相信很多人都已经搜索过各类的webpack构建优化文章,但是很多不是版本太老就是不严谨

本文希望能在耗时优化与构建性能提升之间做一个平衡,即花最少的时间,对官方模板做最少的修改下,赚取最大的构建性能提升

思路

早期版本的vue-cli和webpack2时代,网上流传以下优化配置,但其实新版本的vue-cli和webpack3已经不需要

使用ParallelUglifyPlugin替换UglifyPlugin(新版本的UglifyPlugin已经支持且默认开启了多线程并行构建,所以此步骤没有必要)
启用webpack3的Scope Hoisting(vue-cli新版本已经配置webapck3,且已经默认开启此配置)善用alias(新版本vue-cli已经进行此项工作)配置CommonsChunkPlugin提取公用代码(新版本vue-cli已经进行此项工作)
对于新版本的vue-cli和webpack3,以下简单配置优化后可提升最少2倍的构建速度

按需引用
启用happypack多核构建项目修改source-map配置启用DllPlugin和DllReferencePlugin预编译库文件
实践

1、按需引用

1.1几乎所有的第三方组件框架都会提供组件的 按需引用 方式,以iview为例,通过借助插件babel-plugin-import 可以实现按需加载组件,减少文件体积,只需要修改 .babelrc 文件
npm install babel-plugin-import --save-dev
// .babelrc
{
"plugins": [["import", {
"libraryName": "iview",
"libraryDirectory": "src/components"
}]]
}
1.2然后这样按需引入组件,就可以减小体积了
import { Button } from 'iview'
Vue.component('Table', Table)
2、启用happypack多核构建项目

安装happypack后,修改 /build/webpack.base.conf.js 文件即可
npm install happypack --save-dev
// /build/webpack.base.conf.js
const HappyPack = require('happypack')
const os = require('os')
const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length })
// 增加HappyPack插件
plugins: [
new HappyPack({
id: 'happy-babel-js',
loaders: ['babel-loader?cacheDirectory=true'],
threadPool: happyThreadPool,
})
]
// 修改引入loader
{
test: /\.js$/,
// loader: 'babel-loader',
loader: 'happypack/loader?id=happy-babel-js', // 增加新的HappyPack构建loader
include: [resolve('src'), resolve('test')]
}
3、修改source-map配置

3.1首先修改 /config/index.js 文件
// /config/index.js
dev环境:devtool: 'eval'(最快速度)
prod环境:proctionSourceMap: false(关闭source-map)
3.2然后修改 /src/main.js 文件,关闭生产环境的调试信息
// /src/main.js
const isDebug_mode = process.env.NODE_ENV !== 'proction'
Vue.config.debug = isDebug_mode
Vue.config.devtools = isDebug_mode
Vue.config.proctionTip = isDebug_mode
4、启用DllPlugin和DllReferencePlugin预编译库文件

这是最复杂也是提升效果最明显的一步,原理是将第三方库文件单独编译打包一次,以后的构建都不需要再编译打包第三方库

4.1 增加 build/webpack.dll.config.js 文件,并在其中配置需要单独DLL化的模块
const path = require("path")
const webpack = require("webpack")
mole.exports = {
// 你想要打包的模块的数组
entry: {
vendor: ['vue/dist/vue.esm.js', 'axios', 'vue-router', 'iview']
},
output: {
path: path.join(dirname, '../static/js'), // 打包后文件输出的位置
filename: '[name].dll.js',
library: '[name]_library'
},
plugins: [
new webpack.DllPlugin({
path: path.join(dirname, '.', '[name]-manifest.json'),
name: '[name]_library',
context: dirname
}),
// 压缩打包的文件
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
})
]
}
4.2 在 build/webpack.dev.conf.js 和 build/webpack.prod.conf.js 增加如下插件
new webpack.DllReferencePlugin({
context: dirname,
manifest: require('./vendor-manifest.json')
})
4.3 在 /package.json 增加命令
"dll": "webpack --config ./build/webpack.dll.config.js"
4.4 在 /index.html 增加DLL化JS引入(必须首先引入)
<script src="/static/js/vendor.dll.js"></script>
4.5 执行构建
npm run dll(这一步会生成build/vendor-manifest.json和static/js/vendor.dll.js)
npm run dev 或 npm run build
后记

以上四个大步骤完成后,我们就完成了对vue-cli模板工程构建优化提升,虽然看起来依然算不上简单,但是这已经是最最最简单的优化了,还有更多奇技淫巧没有展开,因为我觉得过多的优化配置意义不大,反而会给项目工程带来太多冗余和复杂化

以上的配置实际测试的构建效果是从原先的13秒减少到了6秒左右,热部署更是毫秒级的

最重要的是,最简单化的配置,在未来vue-cli和webpack升级新版本后,也可以很容易的重新配置进去使用,熟练配置一次后,重新再还原配置只需要 5分钟左右 想想花5分钟修改一下配置,就能换来每次构建2倍以上速度的提升,是不是会有点小激动呢:)

这里再多说些后话吧,其实webpack2至webpack3的升级,个人觉得蛮失望的,因为它还是没有从根本上解决其配置过于复杂的问题,作为目标是占领全世界所有web项目构建的产品,它应该更多地从易用性/人性化的角度去考虑
每一次看着webpack的工程里面的各种.babelrc,.postcssrc.js...还有各种的.conf文件,甚至还有各种的main,index,app文件,就忍不住想吐槽,究竟为什么前端的构建会发展成这样,一个好好的项目工程里,十几种配置文件,真的有必要吗?我原本以为webpack3会将这一切变得简单,然而它并没有,不过既然暂时没有办法去改变,那我们能做的就是,尽可能理解其中原理,尽自己最大的可能去简化/优化

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!
推荐阅读:
HTML+JS实现滚动数字的时钟

VueRouter的导航守卫应该怎么使用

vue+element实现表格分页的步奏详解
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
违章建筑被强拆如何确定补偿?违章建筑补偿标准 违章建筑可以得到补偿吗?征收违章建筑物怎么赔偿 违章建筑拆除补偿的细则是怎样的? 违建拆除有补偿吗强拆有赔偿吗,政府征收违建房屋拆除有补偿吗 违章建筑强拆怎么赔偿?违建强拆会赔偿吗 违章建筑被强行拆除有补偿吗?违法建筑被违法强拆怎么赔偿 原材料明细账怎么登帐 原材料明细账用什么账本 小米3安装程序,,老出现储存空间不足怎么办 小米3电信版无法安装百度视频,说我内存不足,我剩余内存还有5g并且我安... 手机图片怎么往上面写字[华为] 更改VUE文件 热更新 华为手机怎样在图片上划圈圈和写字? vue 热重载什么意思?或者&#39;热重载&#39;什么意思?有没有专家解释一下啊, 怎么在华为手机上图片上写字 华为手机照片上写字 怎么在华为手机里面的照片写字? 荣耀60相片怎么写字 数据的基本单位是什么? 怎样才能让蔬菜保鲜 蔬菜保存方法 青菜打成泥如何长期保存? 随身WiFi用来干嘛的,怎么用? 随身wifi手机变热点是什么意思 随身wifi怎样创建热点?收费嘛? 随身wifi是什么东西?有什么作用? 计算机表示信息的基本单位? 复制链接在手机浏览器打开 微信如何打开复制的链接 复制链接在哪个地方打开? 为什么我使用vue的时候用路由时 可以中使用sub vue.js能完全替代jquery在web开发中的功能吗 vue.js 标签里生成的一串字符串是干什么用的 vue里 npm run build后应该怎么运行 弹弹堂无敌发送 猪猪侠4之百变猪猪侠的总目录 历年奖门人节目中的游戏以及规则 崩坏学园2当前版本使魔实用排行 哪个使魔最强 无敌弹珠(Smash hit)破解版,iOS版的(苹果版) 无敌弹珠ios版每次死了都要从来啊 怎么办 TVB曾志伟主持的综艺节目,其中还有叶璇做嘉宾那个综艺节目叫什么名字? 无敌弹珠(弹珠冲击)哪里有不闪退的版本可以玩? TVB奖门人的游戏以及玩法简介 为什么某个窗口会无敌疯狂弹出 奖门人的初生期 DNF刺客的无敌技能有那些 无敌坦克怎么样 所谓一物降一物,请问原子弹有啥东西可以降住它? 抗日血战缅甸的无限弹药和无敌状态如何调 合金弹头全集无敌怎么调