最近一直在做小程式專案的開發,上手直接就是wepy, 風格跟vue差不多,整體上,還算穩定,開發起來比原生的效率要高一點;很多人也知道,mpvue就是用vue搭建的,但始終覺得,失去了路由的vue,就像失去了靈魂;雖然接下來要給大家安利的框架,也貌似失去了該靈魂- taro框架(Taro 是一套遵循 React 語法規範的 多端開發 解決方案。)
taro開發文件: nervjs.github.io/taro/docs/R…
在這裡我將我初步入坑的學習過程,以及構建了大致框架與大家分享下,一直深記我現在的大佬vega的一句話:
“在學習過程中,即使可以複製的程式碼,我都會再自己敲一遍加深印象”
所以感興趣的小夥伴,也可以跟著一步一步做:
一:安裝 Taro 開發工具 @tarojs/cli
npm install -g @tarojs/cli
複製程式碼
二:使用命令建立模板專案
taro init taro-react-mini-program
複製程式碼
可以根據自己的需要,選擇是否使用ts, sass或者less, 接著等安裝好依賴,專案就構建完成;
三:專案目錄結構
├── dist 編譯結果目錄
├── config 配置目錄
| ├── dev.js 開發時配置
| ├── index.js 預設配置
| └── prod.js 打包時配置
├── src 原始碼目錄
| ├── pages 頁面檔案目錄
| | ├── index index頁面目錄
| | | ├── index.js index頁面邏輯
| | | └── index.css index頁面樣式
| ├── app.css 專案總通用樣式
| └── app.js 專案入口檔案
└── package.json
複製程式碼
框架的使用和注意事項,文件中有介紹,我這邊主要寫一些專案配置和踩過的坑;
這裡需要先安裝一些依賴
npm install tslint stylelint tslint-config-prettier -D
複製程式碼
程式碼規範 .prettierrc
{
"stylelintIntegration": true,
"tslintIntegration": true,
"tabWidth": 2,
"singleQuote": true,
"semi": false
}
複製程式碼
.prettierignore
/**/libs/**
dist/
lib/
複製程式碼
樣式規範: .stylelintrc.js
module.exports = {
ignoreFiles: ['**/*.md', '**/*.ts', '**/*.tsx', '**/*.js']
}
複製程式碼
.stylelintignore
**/dist
複製程式碼
tslint.json
{
"extends": ["tslint:recommended", "tslint-config-prettier"],
"rules": {
"ordered-imports": false,
"object-literal-sort-keys": false,
"member-access": false,
"member-ordering": false,
"no-empty-interface": false,
"no-console": [true, "warning"],
"interface-name": [true, "never-prefix"],
"no-empty": false,
"quotemark": [true, "single"]
// "semicolon": [false], // 結尾比較分號
// "trailing-comma": [false], // 結尾必須逗號
// "requireForBlockBody": true,
}
}
複製程式碼
接著配置git的提交commit提交驗證,需要安裝對應的依賴包,可以從我的另外一篇文章看:
再加上自己配置一個.gitignore檔案,就這樣,我們將大致需要的配置檔案都配置好了;看看效果:
當有不規範的程式碼提交的時候
把所有問題都解決之後提交,當然tslint以及其他的一些配置都是自定義的,可以自己配置。覺得麻煩的可以根據自己的“口味”配置專案
然後我們就可以愉快的開發我們的專案,執行npm run dev:weapp,開啟我們的小程式
很多人反饋用原生的 Taro.request或者用第三方axios等等做非同步請求總會有錯,我沒親測,但是自己用promise封裝了方法, 在根目錄src資料夾下建立utils資料夾, 在這裡我簡單的模擬微信授權登入,以及檢測session是否過期,繫結使用者的場景寫一個大概例子,介面為虛構:
├── utils
| ├── api.ts 請求介面設定
| ├── http.ts http公共請求檔案
| └── index.ts
複製程式碼
http.ts程式碼如下:
import Taro from '@tarojs/taro'
import md5 from 'blueimp-md5'
type HttpMethods = 'GET' | 'POST' | 'PUT' | 'DELETE'
// 後端是否支援json格式
const contentType = 'application/x-www-form-urlencoded'
// const contentType = 'application/json'
export default class Http {
noNeedToken = ['mockFakeApi']
get(url: string, data: object) {
return this.commonHttp('GET', url, data)
}
post(url: string, data: object) {
return this.commonHttp('POST', url, data)
}
async commonHttp(method: HttpMethods, url: string, data: object) {
return new Promise<any>(async (resolve, reject) => {
Taro.showNavigationBarLoading()
try {
const res = await Taro.request({
url,
method,
data,
header: {
'content-type': contentType
}
})
Taro.hideNavigationBarLoading()
switch (res.statusCode) {
case 200:
return resolve(res.data.response)
default:
console.log(res.data.message)
reject(new Error(res.data.msg))
}
} catch (error) {
Taro.hideNavigationBarLoading()
reject(new Error('網路請求出錯'))
}
})
}
}
複製程式碼
api.ts
import Http from './http'
const http = new Http()
// 自動登入
const url = 'xxxxx'
export const login = (data: object) => http.post(url, data)
複製程式碼
index.ts (自定義公共處理介面檔案)
import Taro from '@tarojs/taro'
import { login } from './api'
// 獲取微信登入憑證
export const wxLogin = async () => {
try {
const res = await Taro.login()
return res.code
} catch (error) {
console.log('微信獲取臨時憑著失敗')
}
}
export const userLogin = async () => {
try {
await Taro.checkSession()
if (!Taro.getStorageSync('token')) {
throw new Error('本地沒有快取token')
}
} catch (error) {
const code = await wxLogin()
const loginRes: any = await login({
code
// ...(其他引數)
})
console.log('使用者資料', loginRes)
}
}
複製程式碼
最後在pages/index/index.tsx中引用就好了
import { userLogin } from '../../utils/index'
....
async componentDidMount() {
await userLogin()
}
複製程式碼
整個框架的使用大致就是這樣了,react的書法風格還是挺舒服的,如果習慣了vue的寫法可能剛開始會不習慣,有興趣的可以嘗試嘗試,下面再簡單的把一些小技巧給補上:
一:圖片以模組的方式的引入
使用ts搭建的專案,引入靜態資源,比如圖片,會提示找不到模組,這時候就必須將圖片宣告為一個模組:
在types目錄的global.d.ts檔案下:
declare module ‘*.png’ {
const img: any
export default img
}
二:動態新增style
<View style={{backgroundImage: `url(${bgImg})`}}></View>
複製程式碼
三:動態新增class
1.<View className={data.length>0?’class-yes’: ’class-no'}></View>
2.<View className={`common ${data.length>0?’class-yes’: ’class-no}`}></View>
複製程式碼
四:this的指向問題
1)在 Taro 的頁面和元件類中,this
指向的是 Taro 頁面或元件的例項,如果我們要引用原生元件,需要使用到this的時候,如果如下引用:
Taro.createCanvasContext(canvasId, this.$scope)
wx.createLivePlayerContext(liveId, this.$scope)
錯誤:wx.createLivePlayerContext(liveId, this)這樣引入是沒有效果的,this並不是指向 wx.createLivePlayerContext.
(當前版本沒有liveplayer的回撥方法,所以直接用原生wx)
五:全域性樣式問題
全域性原始app.scss 只會影響到頁面級別的檔案,元件的獲取不到全域性的樣式,
可以在元件內部import 全域性樣式檔案,但是這裡就有可能,多個元件都引入全域性,生成多份全域性樣式檔案
相對應的程式碼我上傳到了我的github: