摘要:中可以使用注入變量訪(fǎng)問(wèn)環(huán)境變量中的配置信息向全局樣式傳入共享的全局變量在中引用添加兼容在中添加配置完整配置持續(xù)更新中揭秘系列
目錄
√ 配置多環(huán)境變量
√ 配置基礎(chǔ) vue.config.js
√ 配置 proxy 跨域
√ 修復(fù) HMR(熱更新)失效
√ 修復(fù) Lazy loading routes Error: Cyclic dependency
√ 添加別名alias
√ 壓縮圖片
√ 自動(dòng)生成雪碧圖
√ 去除多余無(wú)效的 css
√ 添加打包分析
√ 配置 externals 引入cdn資源
√ 刪除moment語(yǔ)言包
√ 去掉 console.log
√ 利用splitChunks多帶帶打包第三方模塊
√ 開(kāi)啟 gzip 壓縮
√ 為 sass 提供全局樣式,以及全局變量
√ 為 stylus 提供全局變量
√ 預(yù)渲染prerender-spa-plugin
√ 添加 IE 兼容
√ 文件上傳 ali oss
√ 完整依賴(lài)
創(chuàng)建項(xiàng)目 配置環(huán)境變量??通過(guò)在package.json里的scripts配置項(xiàng)中添加--mode xxx來(lái)選擇不同環(huán)境
??在項(xiàng)目根目錄中新建.env, .env.production, .env.analyz等文件
??只有以 VUE_APP_ 開(kāi)頭的變量會(huì)被 webpack.DefinePlugin 靜態(tài)嵌入到客戶(hù)端側(cè)的包中,代碼中可以通過(guò)process.env.VUE_APP_BASE_API訪(fǎng)問(wèn)
??NODE_ENV 和 BASE_URL 是兩個(gè)特殊變量,在代碼中始終可用
.env serve默認(rèn)的環(huán)境變量
NODE_ENV = "development" VUE_APP_BASE_API = "https://demo.cn/api" VUE_APP_SRC = "https://wechat-timg.oss-cn-hangzhou.aliyuncs.com/demo"
.env.production build默認(rèn)的環(huán)境變量
NODE_ENV = "production" VUE_APP_BASE_API = "https://demo.com/api" VUE_APP_SRC = "https://img-wechat.oss-cn-hangzhou.aliyuncs.com/demo"
.env.analyz 用于webpack-bundle-analyzer打包分析
NODE_ENV = "production" IS_ANALYZ = "analyz" VUE_APP_BASE_API = "https://demo.com/api" VUE_APP_SRC = "https://img-wechat.oss-cn-hangzhou.aliyuncs.com/demo"
??修改package.json
"scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "analyz": "vue-cli-service build --mode analyz", "lint": "vue-cli-service lint" }配置vue.config.js
const IS_PROD = ["production", "prod"].includes(process.env.NODE_ENV); module.exports = { baseUrl: "./", // 默認(rèn)"/",部署應(yīng)用包時(shí)的基本 URL outputDir: process.env.outputDir || "dist", // "dist", 生產(chǎn)環(huán)境構(gòu)建文件的目錄 assetsDir: "", // 相對(duì)于outputDir的靜態(tài)資源(js、css、img、fonts)目錄 lintOnSave: false, runtimeCompiler: true, // 是否使用包含運(yùn)行時(shí)編譯器的 Vue 構(gòu)建版本 productionSourceMap: false, // 生產(chǎn)環(huán)境的 source map parallel: require("os").cpus().length > 1, pwa: {} };配置proxy跨域
const IS_PROD = ["production", "prod"].includes(process.env.NODE_ENV); module.exports = { devServer: { // overlay: { // warnings: true, // errors: true // }, open: IS_PROD, host: "0.0.0.0", port: 8000, https: false, hotOnly: false, proxy: { "/api": { target: process.env.VUE_APP_BASE_API || "http://127.0.0.1:8080", changeOrigin: true } } } }修復(fù)HMR(熱更新)失效
module.exports = { chainWebpack: config => { // 修復(fù)HMR config.resolve.symlinks(true); } }添加別名
const path = require("path"); const resolve = (dir) => path.join(__dirname, dir); const IS_PROD = ["production", "prod"].includes(process.env.NODE_ENV); module.exports = { chainWebpack: config => { // 添加別名 config.resolve.alias .set("@", resolve("src")) .set("assets", resolve("src/assets")) .set("components", resolve("src/components")) .set("layout", resolve("src/layout")) .set("base", resolve("src/base")) .set("static", resolve("src/static")); } }添加打包分析
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin; module.exports = { chainWebpack: config => { // 打包分析 if (process.env.IS_ANALYZ) { config.plugin("webpack-report") .use(BundleAnalyzerPlugin, [{ analyzerMode: "static", }]); } } }配置externals
??防止將某些 import 的包(package)打包到 bundle 中,而是在運(yùn)行時(shí)(runtime)再去從外部獲取這些擴(kuò)展依賴(lài)
module.exports = { configureWebpack: config => { config.externals = { "vue": "Vue", "element-ui": "ELEMENT", "vue-router": "VueRouter", "vuex": "Vuex", "axios": "axios" } } }去掉console.log
const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); module.exports = { configureWebpack: config => { if (IS_PROD) { const plugins = []; plugins.push( new UglifyJsPlugin({ uglifyOptions: { compress: { warnings: false, drop_console: true, drop_debugger: false, pure_funcs: ["console.log"]//移除console } }, sourceMap: false, parallel: true }) ); config.plugins = [ ...config.plugins, ...plugins ]; } } }
npm i --save-dev babel-plugin-transform-remove-console
在babel.config.js中配置
const plugins = []; if(["production", "prod"].includes(process.env.NODE_ENV)) { plugins.push("transform-remove-console") } module.exports = { presets: [["@vue/app",{"useBuiltIns": "entry"}]], plugins: plugins };開(kāi)啟gzip壓縮
npm i --save-dev compression-webpack-plugin
const CompressionWebpackPlugin = require("compression-webpack-plugin"); const productionGzipExtensions = /.(js|css|json|txt|html|ico|svg)(?.*)?$/i; module.exports = { configureWebpack: config => { if (IS_PROD) { const plugins = []; plugins.push( new CompressionWebpackPlugin({ filename: "[path].gz[query]", algorithm: "gzip", test: productionGzipExtensions, threshold: 10240, minRatio: 0.8 }) ); config.plugins = [ ...config.plugins, ...plugins ]; } } }
??還可以開(kāi)啟比gzip體驗(yàn)更好的Zopfli壓縮詳見(jiàn)https://webpack.js.org/plugins/compression-webpack-plugin
npm i --save-dev @gfx/zopfli brotli-webpack-plugin
const CompressionWebpackPlugin = require("compression-webpack-plugin"); const zopfli = require("@gfx/zopfli"); const BrotliPlugin = require("brotli-webpack-plugin"); const productionGzipExtensions = /.(js|css|json|txt|html|ico|svg)(?.*)?$/i; module.exports = { configureWebpack: config => { if (IS_PROD) { const plugins = []; plugins.push( new CompressionWebpackPlugin({ algorithm(input, compressionOptions, callback) { return zopfli.gzip(input, compressionOptions, callback); }, compressionOptions: { numiterations: 15 }, minRatio: 0.99, test: productionGzipExtensions }) ); plugins.push( new BrotliPlugin({ test: productionGzipExtensions, minRatio: 0.99 }) ); config.plugins = [ ...config.plugins, ...plugins ]; } } }為sass提供全局樣式,以及全局變量
??可以通過(guò)在main.js中Vue.prototype.$src = process.env.VUE_APP_SRC;掛載環(huán)境變量中的配置信息,然后在js中使用$src訪(fǎng)問(wèn)。
??css中可以使用注入sass變量訪(fǎng)問(wèn)環(huán)境變量中的配置信息
module.exports = { css: { modules: false, extract: IS_PROD, sourceMap: false, loaderOptions: { sass: { // 向全局sass樣式傳入共享的全局變量 data: `@import "~assets/scss/variables.scss";$src: "${process.env.VUE_APP_SRC}";` } } } }
在scss中引用
.home { background: url($src + "/images/500.png"); }添加IE兼容
npm i --save @babel/polyfill
??在main.js中添加
import "@babel/polyfill";
配置babel.config.js
const plugins = []; module.exports = { presets: [["@vue/app",{"useBuiltIns": "entry"}]], plugins: plugins };完整配置 vue-cli3-config github持續(xù)更新中
???揭秘vue系列???
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99262.html
摘要:一介紹是官方提供的腳手架,用來(lái)快速建立項(xiàng)目。標(biāo)識(shí)項(xiàng)目名稱(chēng),這個(gè)你可以根據(jù)自己的項(xiàng)目來(lái)起名字。初始化完成之后,進(jìn)入安裝目錄,必須先安裝項(xiàng)目依賴(lài),否則無(wú)法運(yùn)行。源文件需要注意的是是入口文件,下的是路由文件,文件是組件文件。 一.介紹 vue-cli是官方提供的腳手架,用來(lái)快速建立項(xiàng)目。 二.安裝 npm install vue-cli -g//全局安裝 三.初始化項(xiàng)目 vue init ...
摘要:根據(jù)組件單向數(shù)據(jù)流和和事件通信機(jī)制,需要由子組件通過(guò)事件通知父組件,并在父組件中修改原始的數(shù)據(jù),完成狀態(tài)的更新。 本文同步在個(gè)人博客shymean.com上,歡迎關(guān)注 寫(xiě)Vue有很長(zhǎng)一段時(shí)間了,除了常規(guī)的業(yè)務(wù)開(kāi)發(fā)之外,也應(yīng)該思考和反思一下封裝組件的正確方式。以彈窗組件為例,一種實(shí)現(xiàn)是在需要模板中引入需要彈窗展示的組件,然后通過(guò)一個(gè)flag變量來(lái)控制彈窗的組件,在業(yè)務(wù)代碼里面會(huì)充斥著冗余的彈...
摘要:它采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài),并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測(cè)的方式發(fā)生變化。安裝和使用在之后的實(shí)踐過(guò)程中講解。有一套良好的代碼規(guī)范,對(duì)于項(xiàng)目的開(kāi)發(fā)和維護(hù)都很友好。 努力了,不一定能成功,但是不努力,感覺(jué)好舒服啊 ——努訓(xùn) 沒(méi)有了解過(guò)vue1.*,直接上手vue2.0;雖然有些吃力但還是很愉快了學(xué)下來(lái)了。 一丶環(huán)境配置 node.js...
摘要:本文將針對(duì)使用生態(tài)開(kāi)發(fā)完成的網(wǎng)站,以版本為基礎(chǔ)兼容目標(biāo),實(shí)現(xiàn)全功能正常使用的全面兼容解決方案。這樣做的目的,是逐步減少全局性方法,使得語(yǔ)言逐步模塊化。此外,使用這個(gè),一旦頁(yè)面不處于瀏覽器的當(dāng)前標(biāo)簽,就會(huì)自動(dòng)停止刷新。 前言 背景情況 vue - 2.5.11 vue-cli 使用模板 webpack-simple http請(qǐng)求:axios Vue 官方對(duì)于 ie 瀏覽器版本兼容情...
摘要:你只要算好各種食材的比例,不用關(guān)心做菜的過(guò)程,就是那個(gè)微波爐。項(xiàng)目搭建步驟官網(wǎng)官網(wǎng)開(kāi)發(fā)環(huán)境安裝配置項(xiàng)目配置如圖所示運(yùn)行項(xiàng)目開(kāi)發(fā)編譯在瀏覽器輸入看到,就跑通了。從基礎(chǔ)開(kāi)始,循序漸進(jìn),含有常用實(shí)戰(zhàn)項(xiàng)目,貼近企業(yè)真實(shí)現(xiàn)狀。 用一個(gè)完成的Vue系列文章,讓大家全面理解Vue的實(shí)現(xiàn)原理,掌握實(shí)用技巧,能在實(shí)戰(zhàn)中使用Vue,解鎖一個(gè)開(kāi)發(fā)技能。文末有文章大綱請(qǐng)查看。不墨跡了!馬上寫(xiě)內(nèi)容: 1.為什...
閱讀 3668·2021-11-19 09:40
閱讀 3131·2019-08-30 15:54
閱讀 2336·2019-08-30 15:44
閱讀 3224·2019-08-29 15:35
閱讀 3358·2019-08-29 12:22
閱讀 2886·2019-08-28 18:01
閱讀 3171·2019-08-26 13:54
閱讀 933·2019-08-26 12:24