摘要:或者在中導(dǎo)入樣式文件存放全局通用請(qǐng)求存放通用方法這是時(shí)生產(chǎn)的臨時(shí)目錄,默認(rèn)包含和,有些插件也會(huì)在這里生成一些其他臨時(shí)文件。項(xiàng)目中常用于發(fā)送請(qǐng)求,等待服務(wù)端響應(yīng)數(shù)據(jù)。如果使用的裝飾器則為
umi.js使用方法 node環(huán)境安裝
在官網(wǎng)下載與系統(tǒng)相應(yīng)的node版本,node.js版本>=8.10
編輯器推薦使用Visual Studio Code 安裝方法
安裝uminpm install -g umi
推薦使用 yarn 代替 npm 來(lái)安裝 umi , yarn 會(huì)針對(duì)部分場(chǎng)景做一些緩存以節(jié)省時(shí)間,你可以輸入以下命令來(lái)全局安裝 yarn,使用yarn后項(xiàng)目中盡量避免再使用npm,不然可能會(huì)發(fā)生意想不到的錯(cuò)誤。
npm install -g yarn # 安裝完成后,使用命令查看是否安裝成功 yarn -v # 使用yarn安裝umi yarn global add umi # 安裝完成后,使用命令查看是否安裝成功 umi -vumi快速搭建項(xiàng)目
創(chuàng)建項(xiàng)目文件后使用終端工具打開(kāi)文件
推薦使用 yarn create 命令,能確保每次使用最新的腳手架。
yarn create umi / npm create umi
如果提示 create-umi 命令不存在,你需要執(zhí)行 yarn global bin,然后把 global bin 的路徑添加到環(huán)境變量 PATH 中。選擇 project,選擇app項(xiàng)目回車鍵確認(rèn)
? Select the boilerplate type (Use arrow keys) ant-design-pro - Create project with an layout-only ant-design-pro boilerplate, use together with umi block. ? app - Create project with a simple boilerplate, support typescript. block - Create a umi block. library - Create a library with umi. plugin - Create a umi plugin.選擇是否使用 TypeScript,推薦使用TypeScript,輸入y后回車結(jié)束
? Do you want to use typescript? (y/N)選擇你需要的功能
功能介紹詳見(jiàn) plugin/umi-plugin-react
? What functionality do you want to enable? (Press項(xiàng)目創(chuàng)建完成to select, to toggle all, to invert selection) ?? antd ? dva ? code splitting ? dll
啟動(dòng)項(xiàng)目 yarn start / npm run start環(huán)境配置
在.env文件中可更改環(huán)境配置,一般不需要更改,常見(jiàn)更改例如
# 更改服務(wù)啟動(dòng)端口號(hào) PORT=8001 # 關(guān)閉自動(dòng)打開(kāi)瀏覽器,默認(rèn)為打開(kāi) BROWSER=none
詳細(xì)配置
config配置編譯時(shí)的配置文件,.umirc.(js|ts) 和 config/config.(js|ts),二者選一,不可共存
推薦在主文件夾下創(chuàng)建config文件,使用config.js進(jìn)行項(xiàng)目配置(刪除自動(dòng)搭建項(xiàng)目時(shí)創(chuàng)建的.umirc.(js|ts))
詳細(xì)配置
config.local.js和config.production.js可在此配置開(kāi)發(fā)環(huán)境和線上環(huán)境不同的配置,在進(jìn)行打包時(shí)需修改package.json中腳本代碼
# 下載cross-env開(kāi)啟代碼分割功能 yarn add -D cross-env / npm install --save-dev cross-env # package.json中 "scripts"修改 "build": "cross-env UMI_ENV=production umi build"typings.d.ts配置(使用typescript)
根據(jù)實(shí)際情況進(jìn)行后綴添加,否則ts會(huì)報(bào)導(dǎo)入錯(cuò)誤
declare module "*.png"; declare module "*.jpg"; declare module "*.less";tslint.yml配置(使用typescript)
修改tslint規(guī)則,可根據(jù)個(gè)人使用情況修改,詳細(xì)配置可見(jiàn)tslint-react相關(guān)約定規(guī)則
# 推薦修改 rules: eofline: true no-console: true no-construct: true no-debugger: true no-reference: true no-trailing-whitespace: false jsx-no-multiline-js: false jsx-alignment: false jsx-no-lambda: false(js|ts)config.json開(kāi)啟ES7裝飾器功能
"experimentalDecorators": true文件詳解 mock文件
存放mock.js,默認(rèn)開(kāi)啟mock功能,可在.env文件中關(guān)閉: MOCK=none
src所有與項(xiàng)目相關(guān)代碼存放在src文件之中
src/assets存放靜態(tài)資源,例如圖片文件、字體文件等
src/components存放全局通用組件
src/layouts全局布局,如果該文件夾下有index.(js|tsx)會(huì)在所有路由外面嵌套一層路由
例如之前路由為
[ { path: "/", component: "./pages/index" }, { path: "/users", component: "./pages/users" }, ]
嵌套之后為
[ { path: "/", component: "./layouts/index", routes: [ { path: "/", component: "./pages/index" }, { path: "/users", component: "./pages/users" }, ] } ]
可在index文件中進(jìn)行全局布局,或者根據(jù)pathname修改不同路由下的布局
src/models全局models,如果有一個(gè)以上的頁(yè)面會(huì)使用相同namespace空間內(nèi)的代碼,請(qǐng)將models文件放在此處,不然兩個(gè)頁(yè)面之間做交互時(shí),
namespace中的代碼會(huì)產(chǎn)生影響
存放通用樣式,如果想覆蓋全局樣式可在global.(css|less|sass|scss)進(jìn)行修改,此文件不走 css modules,且會(huì)自動(dòng)被引入。
或者在app.(js|ts)中導(dǎo)入樣式文件
存放全局通用請(qǐng)求
src/utils存放通用方法
src/pages/.umi這是 umi dev 時(shí)生產(chǎn)的臨時(shí)目錄,默認(rèn)包含 umi.js 和 router.js,有些插件也會(huì)在這里生成一些其他臨時(shí)文件??梢栽谶@里做一些驗(yàn)證,但請(qǐng)不要直接在這里修改代碼,umi 重啟或者 pages 下的文件修改都會(huì)重新生成這個(gè)文件夾下的文件。
該文件下的router.js可查看自動(dòng)生成的路由
項(xiàng)目頁(yè)面文件,在不同文件中創(chuàng)建的components、models、services文件最好只在該頁(yè)面中使用,可使項(xiàng)目結(jié)構(gòu)變得更加清晰
tests該文件為測(cè)試腳本文件,不會(huì)生成路由配置,如果需要使用mock測(cè)試,可以在外部mock文件中或者在該文件下創(chuàng)建__mock__文件
Dva.js使用需掌握的知識(shí)點(diǎn) Model在 umi 項(xiàng)目中,你可以使用 dva 來(lái)處理數(shù)據(jù)流,以響應(yīng)一些復(fù)雜的交互操作。這些處理數(shù)據(jù)流的文件統(tǒng)一放在 models 文件夾下,每一個(gè)文件默認(rèn)導(dǎo)出一個(gè)對(duì)象,里面包含數(shù)據(jù)和處理數(shù)據(jù)的方法,通常我們稱之為 model 。一個(gè) model 文件的結(jié)構(gòu)一般是這樣的:
export default { namespace: "example", // 這個(gè) model 的名字,必須全局唯一,否則相同namespace的代碼會(huì)產(chǎn)生影響 state: { count: 0, }, // 初始數(shù)據(jù) reducers: { save() { ... }, }, // 用于修改數(shù)據(jù) effects: { *getData() { ... }, }, // 用于獲取數(shù)據(jù) subscriptions: { setup() { ... }, }, // 用于訂閱數(shù)據(jù) }Reducer
每一個(gè) reducer 都是一個(gè)普通函數(shù),接受 state 和 action 作為參數(shù),即:(state, action) => state ,你可以在函數(shù)中更改舊的 state,返回新的 state 。
reducers: { save(state, { payload }) { return ({ ...state, ...payload }); }, },Effect
每一個(gè) effect 都是一個(gè) 生成器函數(shù) ,你可以在這里獲取你需要的數(shù)據(jù),例如向服務(wù)器發(fā)起一個(gè)請(qǐng)求、或是獲取其他 model 里的 state 。為了明確分工,你無(wú)法在 effect 中直接修改 state ,但你可以通過(guò) put 方法 調(diào)用 reducer 來(lái)修改 state
state:{ assets:{}, }, *changeAssets({ payload }, { call, put, select }) { const user = yield select(states => states.user); const assets = yield call(fetchData, user); yield put({ type: "save", payload: { assets } }); },select
此方法用于獲取當(dāng)前或其他 model 的 state 。
const data = yield select(states => states[namespace]);call
此方法用于執(zhí)行一個(gè)異步函數(shù),可以理解為等待這個(gè)函數(shù)執(zhí)行結(jié)束。項(xiàng)目中常用于發(fā)送 http 請(qǐng)求,等待服務(wù)端響應(yīng)數(shù)據(jù)。
const data = yield call(doSomethingFunc, parameter);put
此方法用于觸發(fā)一個(gè) action,這個(gè) action 既可以是一個(gè) reducer 也可以是一個(gè) effect 。
yield put({ type: "reducerName", payload: { page } });Subscription
subscription 用于訂閱一個(gè)數(shù)據(jù)源,根據(jù)需要使用 dispatch 觸發(fā)相應(yīng)的 action。數(shù)據(jù)源可以是當(dāng)前的時(shí)間、服務(wù)器的 websocket 連接、keyboard 輸入、geolocation 變化、history 路由變化等等。 項(xiàng)目中常用于頁(yè)面初始化數(shù)據(jù)的自動(dòng)請(qǐng)求,如:
subscriptions: { setup({ dispatch, history }) { return history.listen(({ pathname, query }) => { // 進(jìn)入 "/home" 路由,發(fā)起一個(gè)名叫 "query" 的 effect if (pathname === "/home") { dispatch({ type: "query" }); } }); }, },dispatch
類似 effect 中的 put 方法,你可以在 subscription 的參數(shù)、或是一個(gè)已經(jīng) connect 過(guò)的組件的 props 中拿到。
connect通過(guò)此方法在你的組件中獲取到指定 model 的 state 數(shù)據(jù)。
import { connect } from "dva"; function App({ user, dispatch }) { const handleClick = () => { dispatch({ type: "user/fetchUser" }); }; return (); } export default connect(({ user }) => ({ user }))(App);Hello, {user}
如果使用es7的裝飾器則為
import { connect } from "dva"; @connect(({ user }) => ({ user })) function App({ user, dispatch }) { const handleClick = () => { dispatch({ type: "user/fetchUser" }); }; return (); } export default App;Hello, {user}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/103545.html
摘要:,中文可發(fā)音為烏米,是一個(gè)可插拔的企業(yè)級(jí)應(yīng)用框架。以路由為基礎(chǔ)的,支持類的約定式路由,以及各種進(jìn)階的路由功能,并以此進(jìn)行功能擴(kuò)展,比如支持路由級(jí)的按需加載。全局存于目錄,所有頁(yè)面都可引用頁(yè)面不能被其他頁(yè)面所引用。 umi,中文可發(fā)音為烏米,是一個(gè)可插拔的企業(yè)級(jí) react 應(yīng)用框架。umi 以路由為基礎(chǔ)的,支持類 next.js 的約定式路由,以及各種進(jìn)階的路由功能,并以此進(jìn)行功能擴(kuò)展...
摘要:適配路由問(wèn)題絕對(duì)能用的一篇配置,文末直接有文件,伸手黨直接拿走本文環(huán)境比較復(fù)雜,首先兩層轉(zhuǎn)發(fā),并且訪問(wèn)路徑也不是根路徑。不對(duì)做編碼,因此請(qǐng)求為,可以被規(guī)則匹配到注意是空格。配置錯(cuò)誤解決優(yōu)先級(jí)問(wèn)題后,問(wèn)題依然存在。導(dǎo)致找不到請(qǐng)求。 nginx 適配react-routerbrowserRoute 路由問(wèn)題 絕對(duì)能用的一篇nginx配置,文末直接有文件,伸手黨直接拿走 本文環(huán)境比較復(fù)雜,首...
摘要:面向?qū)ο竺嫦驅(qū)ο蠡A(chǔ)面向?qū)ο笫裁词穷惥哂邢嗤瑢傩蕴卣骱头椒ㄐ袨榈囊幌盗袀€(gè)體的集合,類是一個(gè)抽象的概念。析構(gòu)函數(shù),當(dāng)一個(gè)對(duì)象被銷毀前,自動(dòng)調(diào)用。作用是為新克隆的對(duì)象進(jìn)行初始化賦值對(duì)象序列化時(shí),自動(dòng)調(diào)用。使用抽象類的作用限制實(shí)例化。 面向?qū)ο?面向?qū)ο蠡A(chǔ) 面向?qū)ο?什么是類? 具有相同屬性(特征)和方法(行為)的一系列個(gè)體的集合,類是一個(gè)抽象的概念。 什么是對(duì)象? 從類中,拿到的具有具體...
摘要:因?yàn)橥ǔ0巡皇褂眯揎椀某蓡T變量和方法也稱為實(shí)例變量實(shí)例方法。形參個(gè)數(shù)可變的方法允許定義形參個(gè)數(shù)可變的參數(shù),從而允許為方法指定數(shù)量不確定的形參。方法返回值類型修飾符等,與方法重載沒(méi)有任何關(guān)系。 類和對(duì)象 定義類 面向?qū)ο蟮某绦蛟O(shè)計(jì)過(guò)程中有兩個(gè)重要概念:類(class)和對(duì)象(object,也被稱為實(shí)例,instance),其中類是某一批對(duì)象的抽象,可以把類理解成某種概念;對(duì)象才是一個(gè)具體...
摘要:對(duì)象的引用關(guān)鍵字總是指向調(diào)用該方法的對(duì)象。根據(jù)出現(xiàn)位置的不同,作為對(duì)象的默認(rèn)引用有兩種情形。構(gòu)造器中引用該構(gòu)造器正在初始化的對(duì)象。如果同一個(gè)類中包含了兩個(gè)或兩個(gè)以上方法的方法名相同,但形參列表不同,則被稱為方法重載。 類和對(duì)象 定義類 面向?qū)ο蟮某绦蛟O(shè)計(jì)過(guò)程中有兩個(gè)重要概念:類(class)和對(duì)象(object,也被稱為實(shí)例,instance),其中類是某一批對(duì)象的抽象,可以把類理解成...
閱讀 2303·2021-11-24 10:18
閱讀 2741·2021-11-19 09:59
閱讀 1725·2019-08-30 15:53
閱讀 1202·2019-08-30 15:53
閱讀 1080·2019-08-30 14:19
閱讀 2496·2019-08-30 13:14
閱讀 3029·2019-08-30 13:00
閱讀 1968·2019-08-30 11:11