由於業務關係,涉及到的新老業務較多。所以接觸過webpack早期與後期的階段。
以及vue-cli二、三、4
咱們如今已經在使用vue-cli4了css
剝離公用資源
如何使用(vue-li三、4)的小夥伴能夠看如下html
先將dll配置文件寫好
webpack.dll.config.js前端
const path = require('path'); const webpack = require('webpack'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const utils = require('../config/utils'); const packageSysName = require('../package.json').name; // 這個操做是獲取name,打包的時候植入本身的對應的系統 可刪除 const sysName = utils.getSystemName(packageSysName); // 這個操做是獲取name,打包的時候植入本身的對應的系統 可刪除 const resolve = dir => path.join(__dirname, '..', dir); module.exports = { entry: { vue: ['vue', 'vuex', 'vue-router', 'axios'], ec: ['echarts'], utils: ['moment'], ui: ['element-ui'] }, // devtool:'source-map', output: { path: path.join(__dirname, '..', 'public/vendor'), filename: '[name].dll.js', library: '[name]_[hash]' }, plugins: [ new webpack.DllPlugin({ path: path.join(__dirname, '..', 'public/vendor', '[name]-manifest.json'), name: '[name]_[hash]', context: process.cwd() }), new CopyWebpackPlugin([{ from: resolve('./public/vendor'), to: resolve(`./dist/resources/${sysName}/assets/vendor`), toType: 'dir' }]) ], resolve: { alias: { vue$: 'vue/dist/vue.esm.js' } } };
引入此配置文件於vue.config.js中(vue-cli三、4)vue
dllEntry.forEach(dll => { result.push(`resources/${sysName}/assets/vendor/${dll}.dll.js`) }); if (IS_PROD) { Object.keys(externalsMaps.map).forEach(exter => { const { name, version } = externalsMaps.map[exter]; result.push(`${name}/v${version}/${name}.js`); result.push(`${name}/v${version}/${name}.css`); }); } return result;
最後使用 html-webpack-tags-plugin 此插件
對其生成的文件在編譯過程當中自動插入html文件中webpack
如下提供案例是webpack 4.39.2的ios
const MiniCssExtractPlugin = require('mini-css-extract-plugin'); new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // all options are optional filename: `${name}.css`, chunkFilename: '[name].chunk.css' }); //loader部分 { test: /\.scss$/, use: [{ loader: MiniCssExtractPlugin.loader, options: { hmr: process.env.NODE_ENV === 'development' } }, 'css-loader', 'postcss-loader', 'sass-loader' ] }
圖片文件咱們分爲幾個策略
通常的icon以及小文件,使用svg-sprite的模式進行打包。svg能夠改變顏色,這在icon裏是十分好用的,由於icon大多都有不一樣的狀態。
如下提供案例依舊是vue-cli4的nginx
config.module .rule("images") .test(/\.(svg|png|jpe?g|gif|webp)(\?.*)?$/) .exclude .add(resolve('src/assets/image/icons')) .add(resolve('src/components/menu/icon')) .add(resolve('src/assets/image/crmMonitor/process')) .end() .use('url-loader') .tap(options => merge(options, { limit: 8192, //限制圖片大小,小的圖片將轉化爲base64 fallback: { loader: 'file-loader', options: { name: IS_PROD ? `${staticResource}/img/[name].[ext]` : `img/[name].[ext]` } } })); config.module .rule('svg-sprite-loader') .test(/\.svg$/) .include .add(resolve('src/assets/image/icons')) //處理svg目錄 .add(resolve('src/components/menu/icon')) .add(resolve('src/assets/image/crmMonitor/process')) .end() .use('svg-sprite-loader') .loader('svg-sprite-loader') .options({ symbolId: 'icon-[name]' });
大部分會使用cdn。可是由於我手下的項目都是局域網項目:)
但也難不倒我這樣的小天才web
由於我在部門內開發了前端類用庫。而這部分的庫有不少版本迭代以及多人使用。且部分組件是應該按需加載的。
我將其打包到服務器上後,提供了地址(並在其中打上版本號),並用nginx將其攔截轉發。
因而此時,個人fake cdn就出現了。vue-router
結合dll,與prefetch,preload(什麼是prefetch、preload,爭取下一篇說起一下。好東西。)能夠按需加載。
具體代碼下一章來吧~~~vuex
後續更新
其實工程化我使用過gulp、webpack兩個腳手架。
gulp是比較簡單易上手的,因此簡單的項目,好比只是簡單gzip後使用的js,就會使用gulp。他的pipe鏈條模式印象深入。webpackChain有點這個意思。
下一篇會詳細說下本身寫loader plugin的時候遇到的問題