React是Facebook研發的一款前端框架(MVC框架:側重於view層操作),目前在行業內廣泛使用。為了讓框架的體積變得更輕量級,設計者們把其定義為“漸進式”框架,也就是:
- 主體核心的部分都在react/react-dom兩個框架中
- 如果想使用路由,我們需要安裝react-router
- 如果想使用redux進行狀態統一管理,我們再安裝redux/react-redux
- 如果想實現其它的功能,我們還可以繼續安裝 中介軟體/axious等 ...
- 根據使用者所需,再安裝不同的配套元件來完成,這就是"漸進式"設計思想(vue也是這樣設計的)
這樣的操作有好處,也有弊端,麻煩的是,開發中我們需要不斷的安裝各種元件,而且react獨有的jsx語法是不能直接的被瀏覽器解析的,我們在編寫程式過程中使用的es6/less等待都需要進行編譯處理...
此時我們非常期待有一款自動化部署工具,可以幫助我們自動完成這些編譯的操作,webpack就是目前專案中非常常用的自動化部署平臺,我們在搭建專案之前,還需要自己配置webpack。 ... 類似於這樣的操作還有很多,所以複雜繁瑣的專案配置,模組安裝等成為開發者們一大痛苦,有人調侃,是不是以後會出現"前端配置工程師"; 為了解決這些問題,市面上有很多react專案開發的腳手架:
- generator-z-react-cli
- create-react-app
- ... 通過這些腳手架,我們可以快速搭建一套完整的react專案結構,避免人工手動一點點配置。
create-react-app
FaceBook官方釋出了一個無需配置,用於快速構建開發環境的腳手架工具:https://github.com/facebook/create-react-app
1.首先基於npm在全域性安裝create-react-app
npm install -g create-react-app
2.在指定目錄中建立一個react專案工程
create-react-app my-app
my-app是自己設定的專案名稱(遵循npm模組釋出時的要求,例如,名字中布恩那個出現大寫字母或者漢字以及特殊字元等)
3.進入到指定的專案檔案,啟動專案
cd my-app
npm run start 或者 $ yarn start(前提是在全域性安裝了yarn)
生產的結構目錄
my-app
|--build //構建目錄,遵循釋出系統規範
| |-- index.html //靜態頁面
| |-- static //資原始檔
|
|-- node_modules //專案元件資料夾:所有安裝的元件都在這
|
|--src //原始碼目錄
| |--index.js //入口檔案(還生成了其它的檔案,但是沒啥用,我們可以直接的刪除掉)
|
|--public //靜態頁面目錄
| |--index.html //主頁面(還生成了其它的檔案,但是沒啥用,我們可以直接的刪除掉)
|
|-- .gitignore //git提交的忽略檔案,我們一般還需要再手動增加.idea(通過webstorm編輯工具進行開發,生成的檔案)
|--package.json //專案依賴項及專案基礎資訊
|--README.md //專案描述
|-- ...
複製程式碼
生成的package.json
{
"name": "my-app",
"version": "0.1.0",
"private": true,
"dependencies": { //=>生產依賴項
"react": "^16.2.0",
"react-dom": "^16.2.0",
"react-scripts": "1.1.0"
},
"scripts": { //=>可執行指令碼
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
}
/*
* 可執行指令碼註釋:
* $ npm run start 啟動服務,自動編譯專案,可以實現邊開發,邊自動編譯重新整理,看到最新開發的效果
*
* $ npm run build 把專案整體進行編譯,最後再bulid目錄中生成專案編譯後的檔案,我們上傳伺服器的就是這些檔案
*
* $ npm run test 使用Jest作為測試執行程式(不常用)
*
* $ npm run eject 下文具體介紹使用
*
* 當然以上操作也可以基於yarn來完成
*/
複製程式碼
通過分析,我們發現create-react-app有如下的一些特點:
- 僅僅是安裝了react中最常用的react/react-dom元件,其餘的並沒有安裝,所以再專案開發中,我們根據需要,可能還會安裝:$ yarn add redux react-redux react-router-dom prop-types等等
- 生成專案後,腳手架為了"優雅",隱藏了所有的webpack相關的配置檔案,此時檢視myapp資料夾目錄,會發現找不到任何webpack配置檔案;這也就導致了,如果我們需要在webpack中安裝一些自己的loader或者plugin變的很困難;
- create-react-app自動生成的webpack中整合了:eslint(程式碼檢測、url-loader(圖片BASE64[小於10000kb的圖片])、babel-loader(ES6和JSX語法解析)、style-loader、css-loader(CSS程式碼解析)、HtmlWebpackPlugin(產出HTML外掛)等內容
- ...
npm run eject
上面提到,腳手架為了"優雅",隱藏了所有的webpack相關配置檔案,如果我們想要基於原來的基礎再次增加一些自己的東西,首先就要找到這些隱藏檔案並且進行修改。
有的開發者直接到node_modules中去搜尋webpack.config...等檔案,然後進行修改,修改後發現生效了,但是當修改後,我們又安裝了一些其它專案模組,重新編譯的時候,又回到了原有的配置資訊(很頭疼的問題,總不能每一次安裝新模組後,都重新改一次需要修改的配置吧...)
基於create-react-app建立完成專案後,會提供一個eject命令($ yarn eject),基於這個命令,可以把隱藏的webpack檔案展示出來,方便我們二次進行配置。
$yarn eject或者npm run eject 此命令執行完成不可逆轉(慎重使用)
執行完成後,我們可以看到原有的結構目錄發生了一些變化(新增兩個資料夾,package.json中的內容也跟著發生改變)
結構更改
my-app
|-- config //webpack的配置檔案都在這裡
| |--jest
| | |--cssTransform.js
| | |--fileTransform.js
| |--env.js
| |--paths.js
| |--polyfills.js
| |--webpack.config.dev.js
| |--webapck.config.prod.js
| |--webpackDevServer.config.js
|
|--scripts
| |-- build.js
| |-- start.js
| |-- test.js
後期如果想修改配置資訊,修改webpack.config.dev.js、webpack.config.prod.js即可,當然其它的大家也可以去修改(前提是研究明執行的原理)
複製程式碼
package.json中的變更
{
"name": "my-app2",
"version": "0.1.0",
"private": true,
"dependencies": { //=>在依賴項中把之前隱藏的(已經安裝的)模組都顯示出來了,其中很多都是配置webpack需要安裝的
"autoprefixer": "7.1.6",
"babel-core": "6.26.0",
"babel-eslint": "7.2.3",
"babel-jest": "20.0.3",
"babel-loader": "7.1.2",
"babel-preset-react-app": "^3.1.1",
"babel-runtime": "6.26.0",
"case-sensitive-paths-webpack-plugin": "2.1.1",
"chalk": "1.1.3",
"css-loader": "0.28.7",
"dotenv": "4.0.0",
"dotenv-expand": "4.0.1",
"eslint": "4.10.0",
"eslint-config-react-app": "^2.1.0",
"eslint-loader": "1.9.0",
"eslint-plugin-flowtype": "2.39.1",
"eslint-plugin-import": "2.8.0",
"eslint-plugin-jsx-a11y": "5.1.1",
"eslint-plugin-react": "7.4.0",
"extract-text-webpack-plugin": "3.0.2",
"file-loader": "1.1.5",
"fs-extra": "3.0.1",
"html-webpack-plugin": "2.29.0",
"jest": "20.0.4",
"object-assign": "4.1.1",
"postcss-flexbugs-fixes": "3.2.0",
"postcss-loader": "2.0.8",
"promise": "8.0.1",
"raf": "3.4.0",
"react": "^16.2.0",
"react-dev-utils": "^5.0.0",
"react-dom": "^16.2.0",
"redux": "^3.7.2",
"style-loader": "0.19.0",
"sw-precache-webpack-plugin": "0.11.4",
"url-loader": "0.6.2",
"webpack": "3.8.1",
"webpack-dev-server": "2.9.4",
"webpack-manifest-plugin": "1.3.2",
"whatwg-fetch": "2.0.3"
},
"scripts": { //=>去掉了eject命令(這個命令是不可逆轉的,執行一次生效後,就去掉這命令了)
"start": "node scripts/start.js",
"build": "node scripts/build.js",
"test": "node scripts/test.js --env=jsdom"
},
"jest": {
"collectCoverageFrom": [
"src/**/*.{js,jsx,mjs}"
],
"setupFiles": [
"<rootDir>/config/polyfills.js"
],
"testMatch": [
"<rootDir>/src/**/__tests__/**/*.{js,jsx,mjs}",
"<rootDir>/src/**/?(*.)(spec|test).{js,jsx,mjs}"
],
"testEnvironment": "node",
"testURL": "http://localhost",
"transform": {
"^.+\\.(js|jsx|mjs)$": "<rootDir>/node_modules/babel-jest",
"^.+\\.css$": "<rootDir>/config/jest/cssTransform.js",
"^(?!.*\\.(js|jsx|mjs|css|json)$)": "<rootDir>/config/jest/fileTransform.js"
},
"transformIgnorePatterns": [
"[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs)$"
],
"moduleNameMapper": {
"^react-native$": "react-native-web"
},
"moduleFileExtensions": [
"web.js",
"mjs",
"js",
"json",
"web.jsx",
"jsx",
"node"
]
},
"babel": {
"presets": [
"react-app"
]
},
"eslintConfig": {
"extends": "react-app"
}
}
複製程式碼
如果你熟練掌握webpack的配置操作,那麼接下來就可以自己去擴充webpack了...
generator-z-react-cli
一款基於yeoman generator的腳手架:http://yeoman.io/ 1.首先基於npm在全域性安裝yeoman
npm install -g yo
2.其次在全域性下安裝腳手架
npm install -g generator-z-react-cli
3.最後生成專案
yo z-react-cli
結構目錄
my-app
|-- index.html //啟動頁(主頁)
|-- build //構建目錄,遵循釋出系統規範
| |-- index.html //靜態頁面
| |-- static //資原始檔釋出到cdn,或釋出到伺服器
|
|-- src //原始碼目錄
| |--component // 元件
| | |-- common //公共元件
| | |-- temp //父元件
| |--Config //工具方法
| |--Image //圖片資源
| |--Redux //react-redux資料狀態管理
| | |-- action.jsx //派發資料的action
| | |-- reducer.jsx //用於處理action的reducer
| | |-- store.jsx //資料管理器
| |-- Router //路由
| |-- Style //樣式
| |-- template //編譯html模板
| |-- App.jsx //js入口檔案
|
|-- webpack.config.hot //本地熱編譯
|-- webpack.config.buildt //編譯釋出測試環境
|-- webpack.config.online //編譯釋出線上環境
|-- server.js
|-- server_hot.js //本地伺服器啟動檔案
|-- .babelrc //ES6語言解析設定
|-- package.json //專案依賴項
|-- ...
複製程式碼
可執行命令
安裝依賴
npm install
在本地主機(8088埠)上提供熱過載:即輸入http://localhost:8088可訪問正在開發的專案
npm run hot
#專案整體編譯部署,用於測試環境 npm run buildt
#專案整體編譯部署,用於線上環境 npm run online
功能特色
可以解析JSX語法 可以解析ES6語法新特性 支援LESS、SCSS前處理器 編譯完成自動開啟瀏覽器 單獨分離CSS樣式檔案 支援檔案MD5戳,解決檔案快取問題 支援圖片,圖示字型等資源的編譯 支援瀏覽器原始碼除錯 實現元件級熱更新 實現程式碼的熱替換,瀏覽器實時重新整理檢視效果 區分開發環境和生產環境分離業務功能程式碼和公共依賴程式碼 ...
package.json檔案部分預覽
{
"name": "my-app", //=>專案名稱
"version": "1.0.0", //=>專案版本
"description": "...", //=>專案描述
"main": "index.js", //=>專案入口檔案
"scripts": { //=>可執行的命令指令碼
"dev": "node server.js", //=>啟動服務
"hot": "node server_hot.js", //=>專案本地預覽
"buildt": "webpack --config webpack.config.buildt.js --progress --colors --watch -p", //=>專案編譯:用於測試
"online": "webpack --config webpack.config.online.js --progress --colors --watch -p" //=>專案編譯:用於線上
},
...
"dependencies": { //=>生產依賴模組
"babel-polyfill": "^6.23.0",
"body-parser": "^1.17.1",
"deep-extend": "^0.4.1",
"github-markdown-css": "^2.4.0",
"immutable": "^3.8.1",
"isomorphic-fetch": "^2.2.1",
"normalize.css": "^4.1.1",
"pure-render-decorator": "^1.2.1",
"react": "^15.5.4",
"react-dom": "^15.3.2",
"react-redux": "^4.4.5",
"react-router": "^4.1.1",
"react-router-dom": "^4.1.1",
"redux": "^3.6.0",
"redux-immutablejs": "^0.0.8",
"redux-promise": "^0.5.3",
"redux-thunk": "^2.1.0",
"sass-loader": "^4.1.1"
},
"devDependencies": { //=>開發依賴模組
"autoprefixer-loader": "^3.2.0",
"babel-core": "^6.23.1",
"babel-loader": "^6.2.8",
"babel-plugin-transform-decorators-legacy": "^1.3.4",
"babel-preset-es2015": "^6.6.0",
"babel-preset-react": "^6.5.0",
"babel-preset-react-hmre": "^1.1.1",
"babel-preset-stage-0": "^6.16.0",
"body-parser": "^1.15.1",
"browser-sync": "^2.18.8",
"clean-webpack-plugin": "^0.1.16",
"css-loader": "^0.23.1",
"express": "^4.14.0",
"extract-text-webpack-plugin": "^1.0.1",
"file-loader": "^0.8.5",
"html-webpack-plugin": "^2.22.0",
"http-proxy-middleware": "^0.17.3",
"jsx-loader": "^0.13.2",
"less": "^2.6.1",
"less-loader": "^2.2.3",
"node-sass": "^3.11.3",
"react-hot-loader": "^1.3.1",
"react-transform-catch-errors": "^1.0.2",
"react-transform-hmr": "^1.0.4",
"redbox-react": "^1.3.3",
"sass": "^0.5.0",
"sass-loader": "^4.0.2",
"style-loader": "^0.13.1",
"url-loader": "^0.5.7",
"webpack": "^1.13.0",
"webpack-dev-middleware": "^1.8.4",
"webpack-dev-server": "1.14.1",
"webpack-hot-middleware": "^2.13.2"
}
}
複製程式碼
這個腳手架要比create-react-app提供更為豐富的功能,大家可根據自己的喜好選擇。