前言
@vue/cli v3
從開始到現在已經經歷了四個月的迭代(目前RC3),
除了終端初始化的姿勢,還引入了一個新的專案初始化姿勢;
Web端的初始化,體驗了一下,效果很不錯;
後方多圖,感興趣的可以瞧瞧,不感興趣的請止步,免得浪費你的時間,謝謝..
官網及安裝
-
官網 : Vue Cli
-
安裝:
npm i -g @vue/cli
常規命令
大體中文註釋下
Usage: vue <command> [options]
Options:
-V, --version 輸出當前腳手架版本
-h, --help 使用幫助
Commands:
create [options] <app-name> 基於vue-cli-service初始化一個專案,終端
add <plugin> [pluginOptions] 新增外掛到該專案
invoke <plugin> [pluginOptions] 在專案中啟用(呼叫)外掛
inspect [options] [paths...] 檢查專案中的webpack選項
serve [options] [entry] 零配置執行開發模式
build [options] [entry] 零配置執行生產模式
ui [options] web端介面初始化專案
init [options] <template> <app-name> 類似`vue-cli`初始化遠端的模板(需要遵循v3規格的)
執行 vue <command> --help 獲取該選項更詳細的幫助.
複製程式碼
其他不多說,今天只想演示下Web端UI初始化...
UI初始化
0.終端跑起來!!!
在終端執行vue ui
, 會預設初始化localhost:8000
且自動開啟
點選頂部tab的Create
進入初始化介面, 點選Create a new project here
進入新專案初始化
裡面的目錄都是可以展開的,類似本地目錄的體驗,會遍歷出來展示
1.填寫目錄名什麼的
2.選擇配置的細粒度
3.選擇需要開啟的東東
4.針對上一步的選擇進一步的配置
最後點選Create Project
就會開始執行相關的操作和安裝對應的依賴了
其實就是終端在執行,只是頁面也會給你看一些效果,一個遮罩層loading和一些文字
5.建立完畢會有一個管理後臺...相當酷炫..
外掛庫
這個真的很實用,對於專案的擴充什麼的
開發執行
詳細的記錄了模組大小,這是把分析外掛展示出來了...這樣寫程式碼的時候更能感知專案的大小了
不僅如此,任務還可以配置訪問的域名,是否開啟https
,對應的開發模式
6. 外掛更新直觀體驗
有些更新會有一個感嘆號提示該版本可能不穩定,如圖所示
點選更新後顯示一個遮罩層,就是終端在安裝;
7. 專案配置的視覺化
目前這塊我看了下還是不大完善的,需要詳細配置的還是需要閱讀官方腳手架的文件,寫一個vue.config.js
,
等會我會稍微點一下,也很容易
vue-cli 3
的配置檔案引入了一個全域性配置檔案
的概念,在根目錄新建一個vue.config.js
,
比如我們最常用的介面的反向代理,多執行緒編譯(提升編譯速度,只有當核心大於1的時候)
vue.config.js
module.exports = {
devServer: {
proxy: {
'/': {
target: 'xxx'
changeOrigin: true
// pathRewrite: {
// '^/api': '/'
// }
}
}
},
parallel:true,
};
複製程式碼
你在專案初始化的還可以選擇.babelrc
,postcss
這類外掛檔案獨立出來,也能集中在package.json
所以說,配置最多分三塊,最少是集中化
- 獨立檔案這類,
.babelrc
,.postcssrc.js
vue.config.js
package.json
更多的配置請查閱官方手冊: Vue Cli
書寫demo
想知道大概寫起來是什麼樣的麼..
我拿了一個下載頁面來改了改,可以跑起來大概是這樣的
產品的url
我就不展示了,統一用xxx
- AppDownload.vue
<template>
<div class="page">
<div class="appicon">
<img src="../../assets/share/yourAppIcon@2x.png">
<p>
<span>真實的
</span><br>
<span>才是最精彩的</span>
</p>
</div>
<wechat-browser-check :check-open="checkBrowser" />
<a
:href="downloadUrl"
class="goto-download"
@click="checkWXPlatform">{{ storeName }}</a>
</div>
</template>
<script lang="ts">
import {Component, Vue} from 'vue-property-decorator';
import WechatBrowserCheck from '@/components/WechatBrowserCheck.vue';
import service from '@/api/index.ts';
const device: any = require('current-device').default;
@Component({
components: {
WechatBrowserCheck,
},
metaInfo() {
return {
title: 'App Download', // set a title
titleTemplate: '%s - Welcome!', // title is now "My Example App - Yay!"
htmlAttrs: {
lang: 'zh'
}
}
}
})
export default class AppDownload extends Vue {
private checkBrowser: boolean = false;// 檢測瀏覽器執行 UA
private downloadUrl: string = ''; // 下載連結
private storeName: string = 'APP 下載'; // 商店名稱
private country: string = 'CN' // 國家
created() {
// 若是 PC 端
if (device.desktop()) {
window.location.href = 'xxx';
}
this.fetchBasicInfo();
}
checkWXPlatform():void {
this.checkBrowser = true;
}
async fetchBasicInfo() {
try {
const [
country = 'CN',
downloadUrl = 'xxx'
] = await Promise.all([
service
.get('/country')
.then((res: any) => res.state === 200 && res.data),
service
.get('/android_v')
.then((res: any) => res.state === 200 && res.data.android_apk_url)
]);
this.getMobileApp(country, downloadUrl);
} catch (error) {
console.log('網路錯誤');
}
}
getMobileApp(country: string, downloadUrl: string): void {
if (device.ios() || device.ipad() || device.iphone()) {
country === 'CN'
? (this.storeName = 'IOS 下載')
: (this.storeName = 'App Store');
this.downloadUrl =
'xxx';
}
// 獲取下載連結
if (
device.android() ||
device.androidPhone() ||
device.androidTablet()
) {
this.country === 'CN'
? (this.storeName = 'Android 下載')
: (this.storeName = 'Google Play');
this.downloadUrl = downloadUrl;
}
}
}
</script>
<style scoped lang="scss">
.page {
position: relative;
-webkit-overflow-scrolling: touch;
height: 100%;
background: url(../../assets/share/mountainWater.png) no-repeat left top;
background-size: cover;
.appicon {
position: absolute;
top: 65px;
left: 56px;
width: 251px;
img {
display: block;
width: 150px;
height: 150px;
border-radius: 22px;
box-shadow: 0 0 1px rgba(32, 89, 138, 0.31);
}
p {
margin: 35px 0;
text-align: left;
letter-spacing: 1px;
color: #205b8a;
font-size: 24px;
font-weight: 600;
font-stretch: normal;
line-height: 15px;
> span {
display: block;
padding: 5px 0;
white-space: nowrap;
}
}
}
.goto-download {
position: absolute;
z-index: 3;
bottom: 81px;
left: 50%;
display: block;
width: 638px;
height: 87px;
transform: translateX(-50%);
text-align: center;
text-decoration: none;
color: #fff;
border-radius: 100px;
background: rgba(70, 55, 61, 1);
box-shadow: #000 0 2px 4px;
font-size: 32px;
line-height: 87px;
}
}
</style>
複製程式碼
- WechatBrowserCheck.vue
<template>
<div v-if="showIntro"
class="intro-layer">
<div class="desrc">
<p class="desrc-tips">請點選右上角的選擇瀏覽器開啟,謝謝!</p>
</div>
</div>
</template>
<script lang="ts">
import {Component, Emit, Model, Prop, Vue, Watch} from 'vue-property-decorator'
@Component({})
export default class WechatBrowserCheck extends Vue {
private deviceType: string = ''; // 裝置型別
private showIntro: boolean = false;
@Prop({default: 'wechat'})
types!: String;
@Prop({default: false})
checkOpen!: Boolean;
@Watch('checkOpen')
oncheckOpenChanged(val: string, oldVal: string) {
if (val) {
this.openAlert();
}
}
openAlert() {
if (this.checkOpen) {
if (Array.isArray(this.types)) {
this.types.map(item => {
if (item === this.deviceEnvCheck()) {
this.showIntro = true;
}
return item;
});
} else {
this.deviceEnvCheck() === this.types
? (this.showIntro = true)
: (this.showIntro = false);
}
console.log('deviceType:' + this.deviceEnvCheck(), 'types:' + this.types);
}
}
deviceEnvCheck() {
// 檢測需要彈窗的裝置型別
// 獲取訪問的user-agent
let ua: string = navigator.userAgent.toLowerCase() || window.navigator.userAgent.toLowerCase();
if (/MicroMessenger/gi.test(ua)) {
return 'wechat';
}
if (/WeiBo/gi.test(ua)) {
return 'weibo';
}
if (/QQ/gi.test(ua)) {
return 'qq';
}
if (/(iPhone|iPad|iPod|iOS)/gi.test(ua)) {
return 'ios';
}
}
};
</script>
<style lang="scss" scoped>
.intro-layer {
position: fixed;
z-index: 9999;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #f2f2f2;
background-image: url(../assets/share/openbrowser.png);
background-repeat: no-repeat;
background-position: center 80px;
background-size: 100% auto;
.desrc {
width: 90%;
height: auto;
margin: 10px auto;
padding: 10px;
border-radius: 10px;
background-color: #fff;
.desrc-tips {
font-size: 15px;
}
}
}
</style>
複製程式碼
編碼體驗目前來說並不好,周邊庫還不夠完善,需要迭代一段時間才有改善;
目前class
書寫風格是依賴vue-class-component
來實現[裝飾器]
一些特性(prop,watch這些)也是依賴一個庫vue-property-decorator
[裝飾器]
jsx
結合的也不是很徹底..需要做一些妥協,和react的jsx
也有所差異
總結
總體的感覺是很不錯的,感覺以後其他的腳手架也會引入這類的WEB UI,大大改善了體驗;
不過目前來說,用ts + 裝飾器
結合Vue的開發體驗還不是很好,因為有一些BUG...
對JSX
的支援,並不完善,和react
的jsx
也有所差異
目前來說ts+裝飾器
組合配合最好的是angular
, 從ng2
開始就引入了,現在都ng6
了;
期待Vue及周邊庫下半年的改進..下個月新腳手架應該就正式版了(最晚不過中秋)