前言
注:適用于windows系統
本文講述要點:
- vue-cli項目搭建基本環境配置;
- 常用插件描述及分享;
- 項目運行、調試及打包;
- 項目配置及優化;
適用人群:
- vue小白;
- 有html\css\js編程基礎;
- vue項目整體優化(打包后壓縮空間);
一、準備階段
準備階段會將項目環境配置完畢,包含node
、npm
、webpack
和vue-cli
。已經完成的小伙伴可以跳過此步驟看第二階段。
1.安裝node
及npm
??從node.js中文網下載并安裝nodejs點擊下載.msi
的32/64位安裝包,然后雙擊本地文件一路點擊下一步
完成nodeJs
的安裝即可。<font size=2 color=#ff6666>注意安裝8.10以上版本喲!</font>
安裝完成后,打開命令行工具,輸入node -v
,如下:
E:\>node -v
v8.12.0 //版本號
順便在此處繼續輸入npm -v
E:\>npm -v
6.4.1 //版本號
你會驚訝的發現npm
已經神奇的安裝完成了。這是因為npm
在安裝nodeJs
的時候順帶已經裝好了。
2.安裝webpack
注:以下所有npm
操作,由于國內速度較慢甚至出現失敗,可用淘寶鏡像cnpm
替代。下列所有npm
命令,用cnpm
替代即可。方式如下:
npm install -g cnpm --registry=https://registry.npm.taobao.org
??繼續剛才的命令行工具,輸入npm install webpack -g
,-g代表全局安裝
。安裝完成后繼續輸入webpack -v
,出現相應版本號,代表安裝成功。
我在安裝時出現如下狀況:
One CLI for webpack must be installed. These are recommended choices, delivered as separate packages:
- webpack-cli (https://github.com/webpack/webpack-cli)
The original webpack full-featured CLI.
We will use "npm" to install the CLI via "npm install -D".
Do you want to install 'webpack-cli' (yes/no):
解決方案是:輸入npm install webpack-cli -g
。安裝成功后執行webpack -v
查看版本號,如下:
E:\>npm install webpack-cli -g
*
* 安
* 裝 省
* 過 略
* 程
*
E:\>webpack -v
4.29.6 //版本號
3.安裝vue腳手架vue-cli
??繼續上面的命令行工具。接下來就是安裝配置今天的主角了,vue腳手架工具vue-cli
。方法一樣,鍵入命令行npm install vue-cli -g
全局安裝,然后輸入vue -V
<font size=1 color=red>注:是大寫的-V
</font>檢測是否安裝成功。如下:
E:\>vue -V
2.9.6 //版本號
4.小結
??至此,我們已經完成了準備階段的工作。主要完成的是node
、npm
、webpack
和vue-cli
四個工具的環境配置。目前為止,我們在命令行工具的總結應該是如下:版本號不必一致
E:\>node -v
v8.12.0
E:\>npm -v
6.4.1
E:\>webpack -v
4.29.6
E:\>vue -V
2.9.6
二、項目搭建
本階段講述vue-cli
項目搭建及相關配置,包含創建項目
、修改基礎配置
、項目運行
三個模塊,可自行選擇閱讀或跳過。
1.項目創建
??建立一個空文件夾,最好以純英文命名。例,我項目路徑為E>stydy
。打開命令行工具,cd
到該文件目錄下,執行vue init webpack name
,name
可替換為你要創建的項目名。回車之后,會要求輸入一系列的信息,大部分可直接回車略過,注釋如下,沒有注釋的回車略過即可:
E:\stydy>vue init webpack blog
? Project name blog //項目名
? Project description A Vue.js project //項目簡介
? Author xuan0146 <zxm0146@163.com> //作者
? Vue build runtime
? Install vue-router? Yes //使用項目路由
? Use ESLint to lint your code? No //不開啟ESLint語法檢測 注意選No
? Set up unit tests Yes
? Pick a test runner jest
? Setup e2e tests with Nightwatch? Yes
? Should we run `npm install` for you after the project has been created? (recommended) npm
vue-cli · Generated "blog".
最后一步選擇npm
或者yarn
則會自動執行npm install
安裝項目所有依賴包。不選擇的話,自己安裝也是同樣效果。安裝步驟為:
-
cd
到項目路徑; - 執行
npm install
; - 等待完成安裝即可;
2.項目介紹
??cd
到該項目,或者打開文件夾,項目目錄及備注如下:
├── project //項目目錄
│ ├── build //webpack相關配置
│ │ ├── build.js //生產環境構建
│ │ ├── check-versions.js //版本檢查
│ │ ├── utils.js //構建相關工具
│ │ ├── vue-loader.conf.js //處理vue文件的配置信息
│ │ ├── webpack.base.conf.js //webpack基礎配置
│ │ ├── webpack.dev.conf.js //webpack開發環境配置
│ │ ├── webpack.prod.conf.js //webpack生產環境配置
│ ├── config //vue基本配置
│ │ ├── dev.env.js //開發環境配置
│ │ ├── index.js //主要配置
│ │ ├── prod.env.js //生產環境配置
│ │ ├── test.env.js //測試環境配置
│ ├── node_modules //依賴包 忽略
│ ├── src //項目核心文件
│ │ ├── assets //靜態資源 如公用js\css\image\媒體資源等
│ │ ├── components //公用組件
│ │ ├── router //項目路由
│ │ │ ├── index.js //路由控制文件
│ │ ├── App.vue //根組件
│ │ ├── main.js //入口文件
│ ├── static //靜態資源
│ ├── test //模擬測試
│ ├── .babelrc //babel參數
│ ├── .editorconfig //代碼格式
│ ├── .gitignore //git上傳相關配置
│ ├── .postcssrc.js //css相關工具
│ ├── index.html //主頁
│ ├── package-lock.json //記錄當前狀態下實際安裝的各個npm package的具體來源和版本號
│ ├── package.json //項目信息
│ ├── README.md //項目說明
3.啟動項目
??命令行工具鍵入npm run dev
,等待片刻,直到提示如下,則表示啟動成功:
E:\stydy\blog>npm run dev
* * * * * * * *
* 啟動過程忽略 *
* * * * * * * *
Your application is running here: http://localhost:8080
然后復制http://localhost:8080
,在瀏覽器地址欄輸入該url,進入如下頁面:
4.移動端調試
??有的人可能要問了,如果我做移動端項目,不能用localhost去訪問了吧?當然不能,只需要稍微改一下配置即可。當然,端口號8080一樣可以修改,不過一般不做變動。
??用代碼工具(自己習慣的IDE)打開本項目。首先查看本機電腦ip,鍵入命令ipconfig
,查看如下:
E:\stydy\blog>ipconfig
* *
* *
以太網適配器 以太網:
連接特定的 DNS 后綴 . . . . . . . :
本地鏈接 IPv6 地址. . . . . . . . : fe80::da7:800d:d148:e06%10
IPv4 地址 . . . . . . . . . . . . : 192.168.200.127
子網掩碼 . . . . . . . . . . . . : 255.255.255.0
默認網關. . . . . . . . . . . . . : fe80::48:5112:9520:564f%10
192.168.200.1
??其中,IPv4 地址
即為我們所需要的ip。在項目/config/index.js
中,找到host: 'localhost'
,改成IPv4 地址
,例:我的地址為192.168.200.127
:
module.exports = {
dev: {
host: '192.168.200.127', //localhost改為ip
port: 8080, //端口號
}
}
??然后,我們重新啟動項目。注意上次項目啟動后,由于修改了配置文件,因此需要停止項目然后重新啟動。停止項目的命令為Ctrl + C
。重啟項目后,如下:
E:\stydy\blog>npm run dev
* * * * * * * *
* 啟 動 過 程 *
* * * * * * * *
Your application is running here: http://192.168.200.127:8080
??(注意要在同一網絡下。)
??最后,我們復制該地址,即可在所有端PC
、手機
、pad等
查看該項目啦~
三、常用插件
本章節記錄一些vue常用插件,如axios
、echarts
、sass/scss
、lib-flexible
等等。所有命令均可用cnpm
替代。如不需要可直接跳過。、
1.sacc/scss
用途:可用sass/scss
進行css書寫代碼。命令行工具依次鍵入如下命令:
npm install node-sass --save-dev
npm install sass-loader --save-dev
安裝完成后,.vue
里的style
里添加lang="scss"
來指定語言,即可用sass/scss
編寫css代碼。如下:
<style lang="scss" scoped>
...
</style>
2.axios
用途:平時前后端交互使用Ajax
,在vue官方,給出vue-resource
和axios
的作為ajax
的替代。在此處使用vue官方推薦首選的axios
作為案例講述。
- 安裝
npm install axios
- 全局引入
在項目/src/main.js
中引入如下代碼,然后隨意走個請求,發現……報錯?并且在頁面F12控制臺Newwork>Headers
里面發現數據并沒有Form Data形式提交,如何處理呢?見下一步解決。
import axios from 'axios'
- 解決數據格式問題
//完整請求代碼 post為例
this.$axios.post('url', { //路徑
key1: 'value', //參數
key2: 'value' //參數
},
/* *
* 添加如下代碼
* * * * * * start * * * * *
{
transformRequest: [function (data) {
let ret = '';
for (let it in data) {
ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&';
}
return ret
}
],
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
}
/* * * * * * end * * * * *
).then((response) => { //返回數據
console.log(response)
}).catch((error) => { //請求異常捕捉
console.log(error)
})
3.axios解決方案
??另外一個axios數據格式問題的解決方案。 重磅推薦★★★★★
此方案不僅解決數據格式問題,還順便解決了跨域問題。第一步當然還是安裝axios
,同上一步。然后,安裝qs
,命令行工具鍵入npm install qs --save-dev
。然后在項目/src/main.js
中配置如下:
import axios from 'axios'
import qs from 'qs'
Vue.prototype.$axios = axios;
Vue.prototype.$qs = qs;
然后在項目/config/index.js
中,找到proxyTable
,配置及說明如下:
proxyTable: {
'/api': {
//設置url公用部分
target: 'http://192.168.1.100:8080/',
changeOrigin: true, // 如果接口跨域,需要進行這個參數配置
pathRewrite: {
'^/api': '' //這里理解成用‘/api’代替target里面的地址
}
}
},
配置完成之后,在.vue
文件中,請求用例如下:
//參數
let params = this.$qs.stringify({
key: value
});
//請求
this.$axios.post('/api/test', params).then((response) => {
console.log(response);
}).catch((error) => {
console.log(error);
})
最后,鍵入命令npm run dev
,發現請求數據格式已經成為Form Data
的格式,并且即使后端不處理跨域問題,也依然正常可用。原因是proxy
作為中間層,先將數據請求回本地,此過程是中間層node請求后臺,不存在跨域。然后請求過來的數據放在本地,前端再去請求這個數據,就可以解決跨域問題了。
4.echarts可視化
??如今相信大家不少項目需要用到數據可視化吧?各種統計圖表、炫酷可視化效果等等,都需要一個不錯的插件去支撐,比如D3
、AnyChart
、echarts
、HighCharts
等等。本案例用百度的echarts
作為案例講解。
- 安裝依賴
慣例,先裝依賴。命令行工具執行npm install echarts --save-dev
。 - 全局配置
安裝完成后,全局引入。引入方法:進入項目/src/main.js
,如下操作:
import echarts from 'echarts'
Vue.prototype.$echarts = echarts
- 使用
在***.vue
組件中即可正常使用。我在此處用Hello.vue
寫示例:
//template
<div id="demo"></div>
//script
let myChart = this.$echarts.init(document.getElementById('demo')); //初始化
//myChart.clear(); //根據需求配置
myChart.setOption({ // 圖表配置
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
series: [{
data: [820, 932, 901, 934, 1290, 1330, 1320],
type: 'line',
smooth: true
}]
});
//style
#demo{
width: 500px;
height: 500px;
}
-
效果圖
echartsDemo.png 按需引入
試過之后會發現echarts的包很大,會導致打包之后文件過大,因此如果不是剛需的情況下,建議按需引入來完成頁面,會節省許多資源及開銷。首先,將剛才項目/src/main.js
中的兩行代碼注釋掉。接下來,依然以Hello.vue
舉例,如下:
//template && style 不作變動
//script
const echarts = require('echarts/lib/echarts'); //基本模板
require('echarts/lib/chart/line'); //折線圖組件
require('echarts/lib/component/title'); //標題組件
// 初始化實例
let myChart = echarts.init(document.getElementById('demo'));
// 圖表配置
myChart.setOption({
title: { text: '引入title組件可使用標題' },
* * * * * * * *
* 別的配置不變 *
* * * * * * * *
});
5.lib-flexible | px2rem-loader
??lib-flexible作用在于寫頁面的時候實現自適應效果,包括文圖排本等。需要配合px2rem-loader
使用。步驟如下:
- 安裝依賴
npm i lib-flexible --save-dev
npm install px2rem-loader --save-dev
- 引入
項目/src/main.js
中做如下配置:
import 'lib-flexible
- 主頁添加視口配置
項目/index.html
中的head
中添加:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
- px2rem配置
項目/build/utils.js
中如下配置,然后重啟項目即可:
//自適應字體配置
const px2remLoader = {
loader: 'px2rem-loader',
options: {
remUnit: 37.5 //設計稿的寬度除以 10,現階段一般設計稿的寬度都為750px。如果基于iPhone5設計則為32.0(320 / 10 = 32)
}
}
function generateLoaders (loader, loaderOptions) {
const loaders = options.usePostCSS ? [cssLoader, postcssLoader, px2remLoader] : [cssLoader, px2remLoader]
* * *
}
- 更多關于px2rem的介紹請移步官網
四、項目打包
本章節介紹打包
以及去除打包后資源中的.map
文件。
開發完成后,怎么打包到線上呢?emm...this is a problem.
1.打包
命令行工具cd
到該項目下,執行npm run build
來構建項目:
E:\stydy\blog>npm run build
Asset Size Chunks Chunk Names
static/js/vendor.38756a8637fc194013f9.js 442 kB 0 [emitted] [big] vendor
static/js/app.0b5326236ed4caddb252.js 1.1 kB 1 [emitted] app
static/js/manifest.2ae2e69a05c33dfc65f8.js 857 bytes 2 [emitted] manifest
static/css/app.26e0081e2c66d97635076ad7fefbb5b6.css 164 bytes 1 [emitted] app
static/css/app.26e0081e2c66d97635076ad7fefbb5b6.css.map 348 bytes [emitted]
static/js/vendor.38756a8637fc194013f9.js.map 2.38 MB 0 [emitted] vendor
static/js/app.0b5326236ed4caddb252.js.map 8.47 kB 1 [emitted] app
static/js/manifest.2ae2e69a05c33dfc65f8.js.map 4.97 kB 2 [emitted] manifest
index.html 571 bytes [emitted]
Build complete.
2.位置
打包完成后,去哪兒了呢?然后會發現在項目路徑下,出現了一個dist
的文件夾,這里面就是所謂的*** 包 ***了。如下:
├── project
│ ├── build
│ ├── config
│ ├── dist // 包
│ │ ├── static // 壓縮后的資源
│ │ ├── index.html // 主頁
│ ├── node_modules
│ ├── src
│ ├── static
│ ├── test
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .gitignore
│ ├── .postcssrc.js
│ ├── index.html
│ ├── package-lock.json
│ ├── package.json
│ ├── README.md
3.問題&解決
細心的你可能發現了,dist/static/css(或js)
里面,每個css文件和js文件下有一個同名的.map
文件,非常占空間,那它是做什么的呢?又怎么消除呢?
- 作用
查過資料的小伙伴知道了,.map
文件的作用就是:項目打包后,代碼都是經過壓縮加密的,如果運行時報錯,輸出的錯誤信息無法準確得知是哪里的代碼報錯。有了map就可以像未加密的代碼一樣,準確的輸出是哪一行哪一列有錯。 - 如何解決
那么該如何處理這些文件呢?進入項目/config/index.js
,定位到productionSourceMap
,將其值改為false
即可。如下:
productionSourceMap: false,
- 重新打包驗證
在命令行工具重新執行npm run build
,發現.map
文件已經消失,問題解決。如下:
E:\stydy\blog>npm run build
Asset Size Chunks Chunk Names
static/js/vendor.38756a8637fc194013f9.js 442 kB 0 [emitted] [big] vendor
static/js/app.3c96ecd23cc6dc073a3e.js 1.05 kB 1 [emitted] app
static/js/manifest.2ae2e69a05c33dfc65f8.js 799 bytes 2 [emitted] manifest
static/css/app.26e0081e2c66d97635076ad7fefbb5b6.css 95 bytes 1 [emitted] app
index.html 571 bytes [emitted]
Build complete.
五、包優化
??在項目逐漸壯大之后,雖然說上面已經講述過了如何去除.map
文件,但是其中許多.js
文件的體積也不容小覷。尤其是發布到線上以后,某些css/js單個文件體積極可能超上兆的大小,如果項目服務器帶寬不夠,但是頁面迸發量不低的話,分分鐘就可能掛掉。有沒有什么方法能進一步將包優化呢?
1.gzip打包壓縮
- 安裝gzip
慣例,打開命令行工具,安裝gzip
npm install compression-webpack-plugin@1.1.11 --save-dev
- 配置
項目/config/index.js
中,定位到productionGzip
,改為true
:
productionGzip: true,
- 重新打包
npm run build
走起,會發現打包的文件中多了同名的.gz
文件,體積大概壓縮了2/3,很棒的體驗。如下:
E:\stydy\blog>npm run build
Asset Size Chunks Chunk Names
static/js/vendor.38756a8637fc194013f9.js 442 kB 0 [emitted] [big] vendor
static/js/app.3c96ecd23cc6dc073a3e.js 1.05 kB 1 [emitted] app
static/js/manifest.2ae2e69a05c33dfc65f8.js 799 bytes 2 [emitted] manifest
static/css/app.26e0081e2c66d97635076ad7fefbb5b6.css 95 bytes 1 [emitted] app
index.html 571 bytes [emitted]
static/js/vendor.38756a8637fc194013f9.js.gz 155 kB [emitted]
Build complete.
- nginx配置
雖然很給力的節省了許多資源,但是需要運維配合,在gninx.conf
配置文件中做如下配置:
http {
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 8; //壓縮級別
gzip_buffers 16 8k;
#gzip_http_version 1.1;
gzip_min_length 100; //不壓縮臨界值
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
}
2.采用cdn加速
??顧名思義,即將一些比較大的插件放在第三方服務器上去加載,這樣不僅快很多,也能更加節約自己的服務器資源及寬帶資源。我們一般選用unpkg
或者BootCDN
來作為第三方。在此處我們使用BootCDN
來作為第三方加速使用。想了解更多相關知識請點擊unpkg BootCDN。
- 查找包
打開BootCDN,在搜索欄搜索想要的第三方資源。如,我想要替換的是echarts
、Vue
、axios
,則依次搜索echarts
...,然后查找我想要的版本,然后復制<script>標簽
。 - 插入
在項目/index.html
中將標簽插入,如下:
<body>
<div id="app"></div>
//插入在這里
<script src="https://cdn.bootcss.com/vue/2.5.20/vue.min.js"></script>
<script src="https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js"></script>
<script src="https://cdn.bootcss.com/echarts/4.2.1-rc1/echarts-en.common.js"></script>
<script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.js"></script>
</body>
- webpack配置
打開項目/build/webpack.base.conf.js
中,添加externals
:
module.exports = {
context: path.resolve(__dirname, '../'),
//..
externals:{
'vue': 'Vue',
'vue-router': 'VueRouter',
'echarts':'echarts',
'axios':'axios',
}
}
- main配置
打開項目/src/main.js
,將Vue
等注釋掉即可。不注釋也可。
// import Vue from 'vue'
- 打包
最后,見證奇跡的時刻就要到了~
E:\stydy\blog>npm run build
Asset Size Chunks Chunk Names
static/js/vendor.1f9d0533037be66c61cf.js 12.3 kB 0 [emitted] vendor
static/js/app.912fd568ff845fde7c09.js 1.36 kB 1 [emitted] app
static/js/manifest.2ae2e69a05c33dfc65f8.js 799 bytes 2 [emitted] manifest
static/css/app.edc64bd802cdc531977a30fcc8a9d6e1.css 62 bytes 1 [emitted] app
index.html 876 bytes [emitted]
static/js/vendor.1f9d0533037be66c61cf.js.gz 4.62 kB [emitted]
Build complete.
- 搞定
上次打包,vendor
大小為442kB,本次打包,瘋狂縮小至12.3kB。神不神奇厲不厲害
結語
??到這里,vue項目從環境配置、項目搭建,到結構介紹、常用插件依賴安裝使用做了比較詳細的介紹,最后將項目優化也做了一定的補充。
??學而時習之,溫故而知新。至此,以上。
歡迎做客我的博客