一張圖教你快速玩轉vue-cli3

2020-12-25 酷扯兒

本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫

前言

本文系統的梳理了vue-cli3搭建項目的常見用法,目的在於讓你快速掌握獨立搭建vue項目的能力。你將會了解如下知識點:

如何安裝項目插件添加瀏覽器支持如何配置scss/stylus共享全局變量如何整合eleemntUI等第三方框架並實現按需引入配置單/多頁面如何配置自定義環境變量如何在vue.config.js定製自己的webpackvue項目部署思維導圖

接下來,我們根據思維導圖,一步步來解釋和實現我們的目標。

1.安裝項目插件

vue add @vue/cli-plugin-eslint

# 或

vue add xjFile

vue add 的設計意圖是為了安裝和調用 Vue CLI 插件。對於普通的 npm 包而言,我們仍然可以(根據所選的 npm 包)使用包管理器。最後可以在vue.config.js做webpack自定義配置

2.添加瀏覽器支持

browserslist我們可以通過package.json 文件裡的 browserslist欄位或一個單獨的 .browserslistrc 文件來指定項目的目標瀏覽器的範圍。這個值會被 @babel/preset-env 和 Autoprefixer 用來確定需要轉譯的 JavaScript 特性和需要添加的 CSS 瀏覽器前綴

例如:

// .browserslistrc

> 1%

last 2 versions

想要獲取更多browserslist,可移步browserslist

Polyfill默認情況下,cli會把 useBuiltIns: 'usage' 傳遞給 @babel/preset-env,這樣它會根據原始碼中出現的語言特性自動檢測需要的 polyfill。這確保了最終包裡 polyfill 數量的最小化。但是如果其中一個依賴需要特殊的 polyfill,默認情況下 Babel 無法將其檢測出來。我們可以通過如下三種方式解決此類問題:

將依賴添加到 vue.config.js 中的 transpileDependencies 選項

// vue.config.js

module.exports = {

// 默認情況下 babel-loader 會忽略所有 node_modules 中的文件。如果你想要通過 Babel 顯式轉譯一個依賴,可以在這個選項中列出來

transpileDependencies: ['glob']

}

可以使用 @vue/babel-preset-app 的 polyfills 選項預包含所需要的 polyfill

// babel.config.js

module.exports = {

presets: [

['@vue/app', {

polyfills: [

'es6.promise',

'es6.symbol'

]

}]

]

}

使用 useBuiltIns: 'entry' 然後在入口文件添加 import '@babel/polyfill',這種方式的問題就是會增加包的大小3.配置scss/stylus共享全局變量

對與scss,可以使用如下方式開啟:

// vue.config.js

module.exports = {

css: {

loaderOptions: {

sass: {

// 這裡假設你有 `src/variables.scss` 文件

data: `@import "~@/variables.scss";`

}

}

}

}

對於stylus,本人親測使用如上方式無效,可以通過如下方式實現:

vue add style-resources-loader

// vue.config.js

const path = require('path')

module.exports = {

pluginOptions: {

'style-resources-loader': {

'patterns': [

path.resolve(__dirname, 'src/styles/abstracts/*.styl'),

]

}

}

}

4.整合eleemntUI等第三方框架並實現按需引入

安裝babel-plugin-component

npm install babel-plugin-component -D

配置babel.config.js

module.exports = {

presets: [

'@vue/app',

],

plugins: [

[

"component",

{

"libraryName": "element-ui",

"styleLibraryName": "theme-chalk"

}

]

]

}

此時即可按需引入element組件,優化項目體積了。

5.配置單/多頁面

vue-cli默認單頁面結構,我們可以通過配置文件來將項目配置成多頁面:

// vue.config.js

const path = require('path')

module.exports = {

// 單/多頁面

pages: {

index: {

// page 的入口

entry: 'src/home/main.js',

// 模板來源

template: 'public/index.html',

// 在 dist/index.html 的輸出

filename: 'index.html',

// 當使用 title 選項時,

// template 中的 title 標籤需要是 <title><%= htmlWebpackPlugin.options.title %></title>

title: 'Your Web For PC',

// 在這個頁面中包含的塊,默認情況下會包含

// 提取出來的通用 chunk 和 vendor chunk。

// chunks: ['chunk-vendors', 'chunk-common', 'index']

},

// 當使用只有入口的字符串格式時,

// 模板會被推導為 `public/subpage.html`

// 並且如果找不到的話,就回退到 `public/index.html`。

// 輸出文件名會被推導為 `subpage.html`。

// subpage: 'src/subpage/main.js'

},

}

6.如何配置自定義環境變量

你可以替換你的項目根目錄中的下列文件來指定環境變量:

.env # 在所有的環境中被載入

.env.local # 在所有的環境中被載入,但會被 git 忽略

.env.[mode] # 只在指定的模式中被載入

.env.[mode].local # 只在指定的模式中被載入,但會被 git 忽略

如下:

// .env.local

APPID=123

VUE_APP_SECRET=secret

如果你想在客戶端側代碼中使用環境變量,變量名因以 VUE_APP_開頭,如下可獲取定義的環境變量:

console.log(process.env.VUE_APP_SECRET)

7.如何在vue.config.js定製自己的webpack

我們可以使用cli支持的鏈式調用,或者自定義調用:

// vue-cli內部webpack配置

chainWebpack: config => {

// 設置快捷目錄別名

config.resolve.alias.set('utils',resolve('../utils'))

// 修改靜態資源打包方式,下例為超過10k才用文件導入的方式,否則為base64.默認為4k

// config.module

// .rule('images')

// .use('url-loader')

// .loader('url-loader')

// .tap(options => Object.assign(options, { limit: 10240 }))

},

// webpack自定義配置

configureWebpack: config => {

if (process.env.NODE_ENV === 'production') {

// 為生產環境修改配置...

} else {

// 為開發環境修改配置...

}

}

7.vue項目部署

這裡我們使用shell腳本部署,當然大家也可以使用自己熟悉的方式部署:

#!/usr/bin/env sh

# 當發生錯誤時中止腳本

set -e

# 構建

npm run build

# cd 到構建輸出的目錄

cd dist

git init

git add -A

git commit -m 'deploy'

git push -f git@bitbucket.org:<USERNAME>/<USERNAME>.bitbucket.io.git master

cd -

最後,上一張相對完整的配置清單:

// vue.config.js

// 自定義vue配置

const path = require('path');

const resolve = dir => path.join(__dirname, dir);

// mock數據

const mockData = require('./mock/test.json');

module.exports = {

// 基本路徑

publicPath: './',

// 輸出文件目錄

// outputDir: 'dist',

// eslint-loader 是否在保存的時候檢查

// lintOnSave: true,

// 單/多頁面

pages: {

index: {

// page 的入口

entry: 'src/main.js',

// 模板來源

template: 'public/index.html',

// 在 dist/index.html 的輸出

filename: 'index.html',

// 當使用 title 選項時,

// template 中的 title 標籤需要是 <title><%= htmlWebpackPlugin.options.title %></title>

title: 'OpenCoder For PC',

// 在這個頁面中包含的塊,默認情況下會包含

// 提取出來的通用 chunk 和 vendor chunk。

// chunks: ['chunk-vendors', 'chunk-common', 'index']

},

// 當使用只有入口的字符串格式時,

// 模板會被推導為 `public/subpage.html`

// 並且如果找不到的話,就回退到 `public/index.html`。

// 輸出文件名會被推導為 `subpage.html`。

// subpage: 'src/subpage/main.js'

},

// css相關配置

css: {

// 是否使用css分離插件 ExtractTextPlugin

extract: true,

// 開啟 CSS source maps?

sourceMap: false,

// css預設器配置項

loaderOptions: {

// stylus: {

// // @/ 是 src/ 的別名

// // 所以這裡假設你有 `src/variables.stylus` 這個文件, 不過目前測試無效

// data: `@import "~@/style/variables.styl";`

// }

},

// 啟用 CSS modules for all css / pre-processor files.

modules: false

},

pluginOptions: {

// 共享變量

'style-resources-loader': {

preProcessor: 'stylus',

patterns: [

//這個是加上自己的路徑,

//注意:試過不能使用別名路徑

resolve('src/style/variables.styl'),

]

}

},

devServer: {

// 埠

port: 3000,

// 配置代理

proxy: {

'^/api': {

target: 'http://localhost:8081',

ws: true,

changeOrigin: true

},

'^/data': {

target: 'http://localhost:3000'

}

},

// mock

before(app){

app.get('/api/getUser',(req,res,next)=>{

res.json(mockData);

})

}

},

// vue-cli內部webpack配置

chainWebpack: config => {

// 設置快捷目錄別名

config.resolve.alias.set('utils',resolve('../utils'))

// 修改靜態資源打包方式,下例為超過10k才用文件導入的方式,否則為base64.默認為4k

// config.module

// .rule('images')

// .use('url-loader')

// .loader('url-loader')

// .tap(options => Object.assign(options, { limit: 10240 }))

},

// webpack配置

configureWebpack: config => {

if (process.env.NODE_ENV === 'production') {

// 為生產環境修改配置...

} else {

// 為開發環境修改配置...

}

}

}

// babel.config.js

module.exports = {

presets: [

'@vue/app',

],

plugins: [

[

"component",

{

"libraryName": "element-ui",

"styleLibraryName": "theme-chalk"

}

]

]

}

// .browserslistrc

> 1%

last 2 versions

// package.json

{

"name": "pc",

"version": "0.1.0",

"private": true,

"scripts": {

"serve": "vue-cli-service serve",

"build": "vue-cli-service build",

"build:serve": "serve -s dist",

"lint": "vue-cli-service lint",

"test:unit": "vue-cli-service test:unit"

},

"dependencies": {

"clipboard": "^2.0.4",

"core-js": "^2.6.5",

"element-ui": "^2.9.1",

"register-service-worker": "^1.6.2",

"serve": "^11.0.2",

"vue": "^2.6.10",

"vue-router": "^3.0.3",

"vuex": "^3.0.1"

},

"devDependencies": {

"@vue/cli-plugin-babel": "^3.8.0",

"@vue/cli-plugin-eslint": "^3.8.0",

"@vue/cli-plugin-pwa": "^3.8.0",

"@vue/cli-plugin-unit-mocha": "^3.8.0",

"@vue/cli-service": "^3.8.0",

"@vue/test-utils": "1.0.0-beta.29",

"babel-eslint": "^10.0.1",

"babel-plugin-component": "^1.1.1",

"chai": "^4.1.2",

"eslint": "^5.16.0",

"eslint-plugin-vue": "^5.0.0",

"style-resources-loader": "^1.2.1",

"stylus": "^0.54.5",

"stylus-loader": "^3.0.2",

"vue-cli-plugin-style-resources-loader": "^0.1.3",

"vue-template-compiler": "^2.6.10"

}

}

本文梳理了一個最基本的cli3項目配置流程,我們可以根據這個思維導圖,去搭建自己的項目。

相關焦點

  • 基於Vue實現一個有點意思的拼拼樂小遊戲
    技術棧如下:vue-cli4 基於vue的腳手架Xuery 筆者基於原生js二次封裝的dom庫vue mvvm庫因為該應用屬於H5遊戲,為了清亮化筆者沒有採用第三方ui庫, 如果大家想採用基於正文我們先來看看遊戲的預覽界面:在線體驗地址:傳送門本文的算法實現方式在之前的拼拼樂文章中已經說明,這裡主要介紹核心算法, 至於vue-cli的使用方法,筆者之前也寫過對應的文章,大家可以研究學習一下。
  • 使用electron+vue開發一個跨平臺todolist(便籤)桌面應用
    它目前的功能還非常簡單,但是包含了很多我使用electron時遇到問題,這也是electron新手都很可能遇到的,也算是一個技術總結吧;比如:electron無邊框透明窗口/拖拽/置頂/閃爍問題以下是項目README:# 3xhznl-todo-list:sparkles
  • 如何創建vue項目並使用element框架中的el-select
    1、在電腦硬碟上,找到一個位置,新建一個文件夾wmn;滑鼠右鍵選擇Git Bash Here,並在Git窗口輸入cnpm install --global vue-cli命令:cnpm install --global vue-cli
  • Vue超好玩的新特性:DOM傳送門
    所以記得關注我,帶你解鎖 Vue 3 各種好玩的新特性。聯想相信大家或多或少都聽說過 「傳送門」 這個詞。就算沒有聽說過,那麼至少也應該看過《「哆啦A夢」》吧!當點擊按鈕的時候只需要用:emit、eventBus或者Vuex…等一系列你能想到的組件間通信方式進行通信就可以了。把按鈕的值傳給輪播圖,然後輪播圖根據傳進來的值來決定 「面板指示點」 的位置。
  • 尤雨溪在Vue3.0 Beta直播裡聊到了這些…
    很多時候,我們並不需要 vue提供的所有功能,在 vue 2 並沒有方式排除掉,但是 3.0 都可能做成了按需引入。5. Composition APIclass組件還會繼續支持,但是需要引入vue-class-component@next,該模塊目前還處在 alpha 階段。還有Vue 3 + TypeScript 插件正在開發,有類型檢查,自動補全等功能。目前進展可喜。
  • Vue 項目中哪些問題戳中你的痛點?你又是如何解決的?(更新中)
    最近要求使用vue進行前後端分離開發微信公眾號,不斷摸索踩坑之後,總結出如下幾點vue項目開發中常見的問題及解決辦法。如果你是vue大佬,請忽略小弟的愚見^V^列表進入詳情頁的傳參問題。3.query傳參的url展現方式:/detail?
  • VUE項目性能優化實踐——通過懶加載提升頁面響應速度
    網頁中常用的懶加載是圖片的懶加載,對於類似淘寶一樣的多圖頁面,如果等待所有圖片都下載完成再響應用不必然造成頁面加載的卡頓。對於JS資源的加載也是同樣的道理,大JS的加載會造成JS阻塞,頁面出現停止響應的假死狀態。因此可以通過按需加載的方式,提高頁面首屏的加載速度。總結了具體優化步驟,下面我們就開始著手優化吧!
  • 準備將您的Vue應用遷移到Vue 3
    /helper/filter'// your vue object{methods: { toCurrency }}注意:只是toCurrency可以使用;)感謝ES6對象屬性的簡寫將組件重構model為.sync根據RFC文檔,Vue 3將棄用modelVue組件中的選項,並將其替換sync為multiple model。
  • NetDevOps雜談其二,cli與netconf​
    昨天收到了這樣一條消息:你好,我看了你介紹的yang模型和netconf,挺有啟發的,自己寫了腳本實踐了配置交換機,想請教下你我有廠家的yang模型文檔,怎樣方便的編排腳本呢,感覺在python文件上寫yang的模型數據工程量不小啊,和cli也差不了多少了
  • Vue + openLayers 製作離線谷歌瓦片地圖
    二、初始化Vue項目本步驟前提是你本機nodejs環境已經OK,Vue-cli已經裝好,如果這些沒有安裝,你需要找個教程先搞定這些,本文就不贅述了。等待一會兒,按照提示選擇需要一起安裝的包和依賴,選擇 Vue-router,Vuex,不要選擇ESlint。然後一路Enter,直至項目安裝完成,然後執行:完成項目所有依賴的安裝。
  • 史上最完整手機攝影技能:從構圖到修圖,還教你玩轉攝影APP!
    (圖:@Just Loomis)這類構圖最適合新手快速入門,只需將主題放在九宮格中心的四個焦點上,基本就不會出錯。(圖:@Robin Robertis)攝影其實就是一場與光影的博弈,當你了解了光,你才能夠熟練運用它。
  • 前端娛樂圈大瓜:前端人因為 Vue3 的 Ref-sugar 提案打起來了!
    但是,在模板中訪問時,ref 包裝對象會 [被自動解開](https://www.vue3js.cn/docs/zh/guide/reactivity-fundamentals.html#ref-解開)。因此在模板中訪問不需要使用 `.value` 。
  • 精通React/Vue系列之帶你實現一個功能強大的通知提醒框
    不用急,接下來筆者會一步步教你實現。先來鞏固以下組件的分類法:通用型組件: 比如Button, Icon等.布局型組件: 比如Grid, Layout布局等.本文將會使用React來開發該組件,也會使用到Javascript中常用的一些設計模式,比如單例模式,但是不管你使用什麼框架來實現,原理都是通用的,如果感興趣的朋友可以用vue也實現以一下。
  • 《精通react/vue組件設計》之快速實現一個可定製的進度條組件
    每一個組件只負責某一特定的表現或者功能)正文在開始組件設計之前希望大家對css3和js有一定的基礎.我們先看看實現後的組件效果:上圖可以知道封裝後的進度條組件通過對外暴露的接口(react/vue裡面可以看做
  • 手把手教你玩轉 MASCHINE MK3 - 第2集 製作一段經典 House 片段
    在第一集手把手教你玩轉 MASCHINE 的教程中,我們已經學會了如何直接在 MASCHINE 硬體上瀏覽、加載和收藏音色。今天我們的任務是從零開始,用 MASCHINE 來寫一段經典而又不俗的 HOUSE Pattern(片段)!
  • 拒絕海量APP,教你用1款修圖軟體搞定「照片後期」!
    現在帶手機出門拍照+修圖多方便啊~最最最最重要的是,用手機就能輕鬆搞定後期修圖!不信Air君先給你秀波照片。,你是不是也特別想掌握這款神仙軟體,玩轉手機後期呢?這次,Air攝影學院聯合攝影大咖--小醒ISO,針對Snapseed獨家定製一套簡單易學的「手機修圖速成課」。只需3天從0基礎帶你玩轉手機修圖,不用下載海量軟體,一款APP搞定後期!
  • 手把手教你玩轉分身特效!
    今天,在沒有替身,沒有大成本製作的情況下,我們來手把手教教大家如何在視頻剪輯裡玩轉「分身術」!大家先欣賞一下「分身」和自己打招呼的特效:在上面的動圖中,被拍攝的主角「分身」成三人,同框對「自己」打招呼。這樣的特效是怎樣拍攝出來的呢?需要使用三臺攝影機麼?需要找替身麼?答案是:NO!
  • vuex實現預熱篇-vue插件開發
    #泛舟計劃·讓知識更好看#1.如何引用vue插件呢?Vue.use(Vuex)2.use做了什麼事呢?_installedPlugins = []));if (installedPlugins.indexOf(plugin) > -1) {returnthis }// additional parameters var args = toArray(arguments, 1); args.unshift(this);// 如果你傳入的是對象,裡面有install方法,我們就執行這個方法
  • 技術分享:vue 過濾器
    vue 過濾器 1 關於 vue 過濾器 在vue1.0的時候其實是內置了過濾器的,但是考慮到好多過濾器並不一定會被開發所調用,所以把原本內置的過濾器就給去掉了,但是過濾器還是比較普遍的,所以我們從vue2.0之後就需要自己定義過濾器