webpack打包優化
- webpack打包(理解優化的思路以及如何尋找解決辦法)
在生產階段,使用 webpack 打包
1、先重新創建一個生產階段用的webpack.config.prod.js配置文件
注意:該配置文件,就是在開發階段的基礎上,添加一些針對生產環境的配置(比如output)
2、在package.json中,在scripts中增加一個配置
"build":"webpack --progress --config webpack.config.prod.js"
3、在根目錄下運行 npm run build 即可
4、打包完畢之後,在當前目錄下生成了一個index.html好bundle.js
生成好的index.html中會自動導入bundle.js
5、我們接下來運行index.html,發現加載比較慢
webpack打包時候的優化之壓縮bundle.js
優化之壓縮bundle.js
1、先把項目的代碼 從es6 轉成 es5
參考:https://babeljs.io/docs/setup/
中文參考地址:https://babeljs.cn/docs/setup/
1.1、安裝三個包
npm i babel-core babel-loader babel-preset-env -D
1.2、在webpack.config.prod.js中配置
{ test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" }
1.3、在當前目錄下,創建一個.babelrc,增加對預設的處理
"presets": ["env"]
2、在webpack.config.prod.js的plugins寫上壓縮相關的代碼
參考:https://cn.vuejs.org/v2/guide/deployment.html
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"'
}
})
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false,
drop_debugger: true,
drop_console: true
},
comments: false
})
webpack打包之壓縮html
此插件 打包時,會以參照文件 在dist目錄生成index.html 、 bundle.js(在index自動引入文件)
參考:https:
https:
1. 安裝
npm i html-webpack-plugin -D
2. 在webpack.config.prod.js中配置一下
const HtmlWebpackPlugin = require('html-webpack-plugin');
3. plugins配置
new HtmlWebpackPlugin({
template: './template.html',
filename: 'index.html',
minify: {
removeComments: true,
minifyJS: true,
minifyCSS: true,
collapseWhitespace: true,
}
}),
使用 clean-webpack-plugin 在每次打包之前,刪除上一次的dist目錄
1、安裝
npm i clean-webpack-plugin -D
2、在webpack.config.prod.js中配置一下
2.1、導入
var CleanWebpackPlugin = require('clean-webpack-plugin')
2.2、在我們的plugins中配置一下即可
new CleanWebpackPlugin('dist'),
項目中用到的第三方樣式,從bundle.js中剝離出去
步驟:
1、安裝包
npm i extract-text-webpack-plugin -D
2、導入 extract-text-webpack-plugin
3、在webpack.config.prod.js的module更改原先css的配置
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: {
loader:"css-loader",
options: {
minimize: true
}
}
})
}
4、在plugins中寫代碼
new ExtractTextPlugin("styles.css"),
5、如果要壓縮css
搜索 minimize
靜態資源(圖片、字體等)從bundle.js中剝離出去
參考:https:
對我們url-loader進行額外的配置options中配置 limit、name
{
test: /\.(png|jpg|gif|svg|ttf|woff|eot)$/,
loader: 'file-loader',
options: {
limit: 4000,
name: 'static/[name].[ext]?[hash:5]'
}
}
哈希算法:任何文件,經過hash運算(md5),可以得到一個32位定長的字符串,
vue-lazyload的加載的問題解決
參考:https://segmentfault.com/q/1010000009724885
需要以模塊化方式,去加載 require
Vue.use(VueLazyload, {
// loading:'src/statics/site/images/01.gif'
loading: require('./statics/site/images/01.gif'),
})
第三方包從bundle.js中抽離出去
注意點:
1、按需加載的包,就不要單獨抽取出來了,否則會很大
步驟:
1、entry,改成多入口
見代碼 webpack.config.prod.js中的entry
entry: {
'axios': ['axios'],
'jquery': ['jquery'],
'moment': ['moment'],
'v-distpicker': ['v-distpicker'],
'vue-lazyload': ['vue-lazyload'],
'vueCore': ['vue', 'vue-router', 'vuex'],
'bundle': './src/main.js'
},
2、更改output,改成多出口
filename: 'js/[name].js'
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: 'js/[name].js'
},
3、在plugins中配置
iview按需加載,實現element的按需加載
1、不要在webpack.config.prod.js中,對element-ui 進行單獨抽離打包
2、在我們項目中,按需加載element-ui
參考:http://element.eleme.io/#/zh-CN/component/quickstart
2.1、安裝包
npm i babel-plugin-component -D
2.2、在.babelrc中,配置按需導入我們的element的代碼
2.3、在main.js中,用到element的哪些組件,我們就按需導入哪些組件,並且如果我們調用了Vue.use(組件),它就會自動幫我們導入該組件對應的樣式
//使用Vue.use()會自動導入 node_modules\element-ui\lib\theme-chalk\Carousel.css 對應樣式, 無需再引入 css樣式
Vue.use(Carousel)
實現vue路由的懶加載
參考:https:
步驟:
1、安裝包並且在.babelrc中配置
npm i babel-plugin-syntax-dynamic-import -D
2、在導入我們組件的時候,按照懶加載的形式去寫
const Foo = () => import('./Foo.vue')