-
Notifications
You must be signed in to change notification settings - Fork 3.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
第 122 题:webpack 打包 vue 速度太慢怎么办? #238
Comments
happypack多线程插件,DllPlugin |
不用vue |
不用webpack |
webpack 和 vue都不用 |
说说我的处理方式吧,纯经验之谈 1.使用 2.配置webpack的 // ...
externals: {
'element-ui': 'Element',
'v-charts': 'VCharts'
} 3.然后在 4.在 <script src="https://unpkg.com/element-ui@2.10.0/lib/index.js"></script>
<script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/v-charts/lib/index.min.js"></script> 经过以上的处理,再尝试编译打包,会发现速度快了一些。 |
"打包慢",是一个综合的因素,和vue关系不大。 1:确保下webpack,npm, node 及主要库版本要新,比如:4.x比3.x提升很多。 2:loader范围缩小到src项目文件!一些不必要的loader能关就关了吧 3:eslint代码校验其实是一个很费时间的一个步奏。 4:happypack多进程进行 如果上面优化后,时间还是不满意的话,就尝试下5,6吧。 5:动态链接库(DllPlugin),楼上已说。有点类似配置的externals。 6:HardSourceWebpackPlugin会将模块编译后进行缓存,第一次之后速度会明显提升。 |
|
1.开启gzip压缩,这个需要服务端配合,以Nginx为例 |
1.先设externals选项 把一些能直接走cdn的库拿出去如vue,vue-router的 |
|
1、因webpack提供的UglifyJS插件采用单线程压缩,速度很慢。所以将此插件替换为webpack-parallel-uglify-plugin插件,此插件可以并行运行UglifyJS插件,可有效减少构建时间。 //首先下载插件 npm i -D webpack-parallel-uglify-plugin
//修改 webpack.prod.conf.js
//将引入的UglifyJS 和 作用代码注释掉 并替换成下方代码
const ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin')
new ParallelUglifyPlugin({
cacheDir: '.cache/',
uglifyJS:{
output: {
comments: false
},
compress: {
warnings: false,
drop_debugger: true,
drop_console: false
}
}
}), 2、由于运行在node.js之上的webpack是单线程模型,所以webpack做事只能一件一件去做。HappyPack可以让webpack在同一时间处理多个任务,把任务分解给多个子进程去并发执行,处理完之后将结果发给主进程 //首先下载插件 npm install --save-dev happypack
//修改 webpack.base.conf.js
const HappyPack = require('happypack')
const os = require('os')
let happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });
//加入此插件
plugins:[
new HappyPack({
id:'babel',
loaders:['babel-loader?cacheDirectory=true'],
threadPool:happyThreadPool
})
],
//将js loader作用代码替换
// loader: 'babel-loader' 替换成下方loader
loader: 'happypack/loader?id=babel', 3、使用dll plugin => dynamic link library plugin,其中UglifyJS插件也可进行替换,详细请看第一条。 //首先在build文件下创建一个js文件,webpack.dll.conf.js,并写入下方代码
const path = require("path")
const webpack = require("webpack")
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const pkg = require('../package')//引入package文件,目的就是找到依赖
module.exports = {
// 想要打包的模块的数组
entry: {
// vendor: ['axios', 'vue-router', 'vue','weixin-js-sdk','element-ui','vuex']
vendor:Object.keys(pkg.dependencies)//取出所有依赖单独打包
},
output: {
path: path.join(__dirname, '../static/js'), // 打包后文件输出的位置
filename: '[name].dll.js',//生成的文件名字 默认为vendor.dll.js
library: '[name]_library'//生成文件的映射关系,与下面的DLLPlugin配置相对应
},
plugins: [
new webpack.DllPlugin({//生成一个json文件 里面是关于dll.js的配置信息
path: path.join(__dirname, '.', '[name]-manifest.json'),
name: '[name]_library',//与上面output中的配置对应
context: __dirname//上下文环境路径,必须填写,为了与DLLReferencePlugin存在于同一上下文中,否则undefined
}),
// 压缩打包的文件
new UglifyJsPlugin({
uglifyOptions: {
compress: {
warnings: false
}
},
}),
]
}
//然后在webpack.prod.conf.js和webpack.dev.conf.js中加入当前插件
new webpack.DllReferencePlugin({
context: __dirname,//与DllPlugin中的context保持一致
/*这个地址对应webpack.dll.conf.js中生成的那个json文件的路径,这样webpack打包的时候
会检测当前文件中的映射,不会把已经存在映射的包再次打包进bundle.js */
manifest: require('./vendor-manifest.json')
}),
//在package.json中新加一条npm命令,执行webpack.dll.conf.js文件
"dll": "webpack --config ./build/webpack.dll.conf.js"
//tips:每次添加新依赖后,一定要运行npm run dll这个命令一次。
//最后在index.html中引入static/js/vendor.dll.js文件
<script src="static/js/vendor.dll.js"></script> 楼下老哥说的对,已经修改,感谢指正 @zhixinpeng |
由于 JavaScript 是单线程模型,要想发挥多核 CPU 的能力,只能通过多进程去实现,而无法通过多线程实现。所以 happypack 应该是让 webapck 开启新的子进程,子进程处理完成之后把结果汇总到主进程中。 |
1、配置 externals,工具库直接使用 cdn,不需要打包,例如:vue,vue-router 等。 2、在处理 loader 时,配置 include,缩小 loader 检查范围。 3、使用 alias 可以更快地找到对应文件。 4、如果在 require 模块时不写后缀名,默认 webpack 会尝试.js,.json 等后缀名匹配,配置 extensions,可以让 webpack 少做一点后缀匹配。 5、thread-loader 可以将非常消耗资源的 loaders 转存到 worker pool 中。 6、使用 cache-loader 启用持久化缓存。使用 package.json 中的 postinstall 清除缓存目录。 |
使用webpack5,速度有质一般提升 |
不写js |
冷水 |
我工作中用到优化:
|
@dhbdn 使用externals 之后需要手动维护这些文件 升级需要添加手动添加hash 这个怎么破 |
这个可以自动化, html-webpack-tags-plugin 插件在生产环境时自动插入script标签 // 自动externals配置, 打包阶段走cdn
if (process.env.NODE_ENV === 'production') {
const [webpackExternals, scripts] = formatExternal(externals)
debug(`use externals ${JSON.stringify(webpackExternals)}`)
scripts.forEach((url) => debug(`external link: ${url}`))
chain.externals(webpackExternals)
chain.plugin('InjectExternalsToHtml').use(HtmlWebpackTagsPlugin, [{ append: false, usePublicPath: false, scripts }])
} |
|
通用环境: |
缩小文件搜索范围
减少打包文件
缓存
多进程
|
缩小loader的查找范围 |
No description provided.
The text was updated successfully, but these errors were encountered: