create by jsliang on 2019-04-24 11:36:57
Recently revised in 2019-04-25 10:44:54php
Hello 小夥伴們,若是以爲本文還不錯,記得給個 star , 小夥伴們的 star 是我持續更新的動力!GitHub 地址css
【2019-08-16】Hello 小夥伴們,因爲 jsliang 對文檔庫進行了重構,這篇文章中的一些連接可能失效,而 jsliang 缺少精力維護掘金這邊的舊文章,對此深感抱歉。請須要獲取最新文章的小夥伴,點擊上面的 GitHub 地址,去文檔庫查看調整後的文章。html
不折騰的前端,和鹹魚有什麼區別前端
返回目錄node
Create React App 是一個官方支持的建立 React 單頁應用程序的方法。它提供了一個零配置的現代構建設置。react
本文 絕大多數、99% 內容來自 Create React App 的文檔,1% 來自我的的整理。webpack
若是對此話有所誤解,請跳至文:十九 總結ios
可加 QQ 羣:
798961601
,跟隨 jsliang 一塊兒折騰git
返回目錄github
npm i create-react-app -g
create-react-app todolist
cd todolist
npm start
npm build
- todolist
+ node_modules —————————— 項目依賴的第三方的包
- public ———————————————— 共用文件
- favicon.ico —— 網頁標籤左上角小圖標
- index.html —— 網站首頁模板
- mainfest.json —— 提供 meta 信息給項目,並與 serviceWorker.js 相呼應,進行離線 APP 定義
- src ——————————————————— 項目主要目錄
- App.css —— 主組件樣式
- App.js —— 主組件入口
- App.test.js —— 自動化測試文件
- index.css —— 全局 css 文件
- index.js —— 全部代碼的入口
- logo.svg —— 頁面的動態圖
- serviceWorker.js —— PWA。幫助開發手機 APP 應用,具備緩存做用
- .gitignore ——————————— 配置文件。git 上傳的時候忽略哪些文件
- package-lock.json ———— 鎖定安裝包的版本號,保證其餘人在 npm i 的時候使用一致的 node 包
- package.json ————————— node 包文件,介紹項目以及說明一些依賴包等
- README.md ———————————— 項目介紹文件
複製代碼
支持全部現代瀏覽器(IE 九、十、11 除外,若是須要,請自行配置)
支持指數運算符 (ES2016)
支持 async
/ await
(ES2017)
支持 Object Rest
(剩餘) / Spread
(展開) 屬性 (ES2018)
支持動態 import()
(stage 3 proposal)
支持 Class
字段和靜態屬性 (part of stage 3 proposal)
支持 JSX, Flow 和 TypeScript
支持 PostCSS,無需手動添加 CSS 前綴,Create React App 會自動補全
能夠經過 Visio Studio Code 的插件 Debugger for Chrome 調試 Create React App:
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Chrome",
"type": "chrome",
"request": "launch",
"url": "http://localhost:3000",
"webRoot": "${workspaceRoot}/src",
"sourceMapPathOverrides": {
"webpack:///src/*": "${webRoot}/*"
}
}
]
}
複製代碼
若有問題能夠參考下面資料
使用 source maps 分析 JavaScript 包。
這有助於你瞭解代碼膨脹的來源,從而配合其餘插件來減小每一個包的大小,優化項目。
npm i source-map-explorer -S
package.json
"scripts": {
"analyze": "source-map-explorer build/static/js/main.*",
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
}
複製代碼
npm run build
npm run analyze
在 Create React App 中,若是你的 react-scripts
版本是 2.0 或者更高,你能夠經過模塊形式引入樣式:
Button.js
import React, { Component } from 'react';
import styles from './Button.module.css'; // 將 css modules 文件導入爲 styles
import './another-stylesheet.css'; // 導入常規 CSS 文件
class Button extends Component {
render() {
// 做爲 js 對象引用
return <button className={styles.error}>Error Button</button>;
}
}
複製代碼
這樣子不會致使樣式的衝突,就比如你 import JS 進來同樣。
node-sass
:npm i node-sass -S
@import 'styles/_colors.scss'; // 假設 styles 目錄 在 src/ 目錄下
import
引入便可。import React from 'react';
import logo from './logo.png'; // 告訴 Webpack 這個 JS 文件使用了這個圖片
console.log(logo); // /logo.84287d09.png
function Header() {
// 導入結果是圖片的 URL
return <img src={logo} alt="Logo" />; } export default Header; 複製代碼
url
引用便可。.logo {
background-image: url(./logo.png);
}
複製代碼
import React from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
return (
<div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> </header> </div> ); } export default App; 複製代碼
或者:
import { ReactComponent as Logo } from './logo.svg';
const App = () => (
<div> {/* ReactComponent 導入名稱是特殊的 */} {/* Logo 是一個實際的 React 組件 */} <Logo /> </div>
);
複製代碼
在 Create React App 建立的項目中,有個 public 文件夾,該文件夾下一般有:
固然,它不只能夠擁有這些文件,還能夠新增內容。
index.html 能夠引用靜態資源。
在 index.html 中引用的靜態資源不會被 Webpack 打包,而是被複制到打包目錄中,使用方法:
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
複製代碼
只須要加上 %PUBLIC_URL%/
表示引用 public 下的資源便可。
在 JavaScript 中:
render() {
return <img src={process.env.PUBLIC_URL + '/img/logo.png'} />; } 複製代碼
這樣也會引用 public 中的資源,從而讓圖片 不會被 Webpack 打包。固然,須要犧牲的代價有:
此外,因爲它內含 Node.js,因此還能夠利用這點進行數據模擬(Mock),作法是:
axios.get('/api/headerList.json').then()
便可調用該文件進行 Mock。api 下能夠存放多個 json 文件
在 Create React App 中,咱們可使用 React Loadable 來進行代碼的分割。
使用方式:
import Loadable from 'react-loadable';
const LoadableOtherComponent = Loadable({
loader: () => import('./OtherComponent'),
loading: () => <div>Loading...</div>,
});
const MyComponent = () => (
<LoadableOtherComponent/>
);
複製代碼
npx create-react-app my-app --typescript
npm i typescript @types/node @types/react @types/react-dom @types/jest -S
。(記得修改全部 JS 文件爲 TS 文件,例如 src/index.js
-> src/index.tsx
)因爲 Create React App 並無規定路由解決方案,而後市面上比較收歡迎的路由解決方案是 React Router,因此能夠嘗試使用:
npm i react-router-dom -S
process.env.REACT_APP_SECRET_CODE
process.env.NODE_ENV
。值爲:test
、development
、production
。對應三種環境。render() {
return (
<div> <small>You are running this application in <b>{process.env.NODE_ENV}</b> mode.</small> <form> <input type="hidden" defaultValue={process.env.REACT_APP_SECRET_CODE} /> </form> </div> ); } 複製代碼
在開發環境,該頁面渲染爲:
<div>
<small>You are running this application in <b>development</b> mode.</small>
<form>
<input type="hidden" value="abcdef" />
</form>
</div>
複製代碼
Create React App 使用 Jest 做爲其測試運行器。
可是很不幸的是,工做中並無用上,估計之後的工做也可能不會用上,因此我們只須要知道有這回事,等有機會再進行嘗試。
在開發項目的過程當中,最擔憂的莫過於瀏覽器告訴你跨域了:後端端口在 4000,或者主機在另外一個 IP 地址……
因此,咱們須要在開發環境中配置代理。
嗯,你問爲何生產(部署)環境咱們不作代理?由於那屬於後端的活了,或許你是個 全棧 工程師,你能夠自行解決下。
往 package.json 中添加字段:
package.json
"proxy": "http://localhost:4000",
複製代碼
這樣當你調用接口:fetch('/api/todos')
時,它會請求代理到 http://localhost:4000/api/todos
。
固然,有可能 proxy
不夠靈活,小夥伴們能夠嘗試經過直接訪問 Express,並鏈接項目的代理中間件,詳情看參考文獻。
在 Create React App 中,能夠經過下面兩種方法獲取 Ajax 數據:
fetch()
APIaxios
庫固然,沒有限制死必須使用這兩種。
這兩種調用 Ajax 請求獲取數據的方式便捷在它返回 Promise 供鏈式調用數據。
document.title
APIReact Helmet
等第三方庫<!doctype html>
<html lang="en">
<head>
<meta property="og:title" content="__OG_TITLE__">
<meta property="og:description" content="__OG_DESCRIPTION__">
</head>
<body>
</body>
</html>
複製代碼
而後讀取 index.html 並將 __OG_TITLE__
和 __OG_DESCRIPTION__
替換掉便可。
有必要嗎?有必要,也沒有必要。
有必要是由於 好記性不如爛筆頭,本身敲一遍能夠加深點點記憶,並且中文文檔的翻譯比較哆嗦,因此總結起來看着方便。
不必是由於大部分都在 Create React App 的中文文檔/英文文檔中都有提示,因此一些小夥伴可能在下面 ** 了。
whatever, just record.
只能說,各自有各自的安排。
可是,千萬千萬不要隨大流,能用到工做的知識才是 有用知識。
若是這些知識對你目前的工做,或者甚至之後的工做毫無幫助,請忽視它,不管它在前端圈子有多熱鬧。
jsliang
:jsliang 廣告推送:
也許小夥伴想了解下雲服務器
或者小夥伴想買一臺雲服務器
或者小夥伴須要續費雲服務器
歡迎點擊 雲服務器推廣 查看!
jsliang 的文檔庫 由 梁峻榮 採用 知識共享 署名-非商業性使用-相同方式共享 4.0 國際 許可協議進行許可。
基於github.com/LiangJunron…上的做品創做。
本許可協議受權以外的使用權限能夠從 creativecommons.org/licenses/by… 處得到。