React 環境部屬
這一篇文章將介紹如何初始化一個 React 專案。React 使用了 CommonJS modules 的技術,需要透過 Javascript bundler 將 檔案重新打包成 javascript ,才可以在網頁的中使用的。而在 react 中,webpack 是主流的工具。React 的語法是一種「針對 ECMAScript 的自創語法」,瀏覽器也沒辦法直接支援,所以也要靠 babel 先編譯完成。在本篇文章中,我們主要利用 Webpack 作為 bundler,及 babel 做完語法的轉譯工具。
程式碼放在:github
Step 1. 初始化專案 & 安裝套件
首先,我們利用 npm init
初始化一個 node 專案,接著安裝將使用到的工作到專案中。
- react
- webpack, webpack-dev-server
- babel-loader, file-loader
- babel-plugin-react-transform, react-transform-hmr
1 2
| $ mkdir react-example && cd react-example $ npm init
|
1 2 3 4 5 6
| $ npm install react $ npm install webpack webpack-dev-server $ npm install babel-loader babel-core babel-preset-es2015 babel-preset-react $ npm install file-loader $ npm install babel-plugin-react-transform $ npm install react-transform-hmr
|
Step 2. 設定
webpack.config.js 用來設定 webpack 的基礎設定,裡如:要打包在哪裡的檔案,然後輸出在哪裡。 context 設定程式碼的位置,entry 表示進入點。output 則是放檔案產出的位置。module loaders 設定不同的檔案需要使用哪些 loader 轉譯跟打包。
webpack.config.js1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| module.exports = { context: __dirname + "/src",
entry: { javascript: "./app.js", html: "./index.html", },
output: { filename: "app.js", path: __dirname + "/dist", },
module: { loaders: [{ test: /\.jsx?$/, include: [ __dirname + "/src" ], exclude: /node_modules/, loader: "babel" }, { test: /\.html$/, loader: "file?name=[name].[ext]", }] } }
|
另外,可以將 babel-loader 的設定寫在 .babelrc 內。
.babelrc1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| { "presets": ["es2015", "react"], "env": { "development": { "plugins": [ ["react-transform", { "transforms": [{ "transform": "react-transform-hmr", "imports": ["react"], "locals": ["module"] }] }] ] } } }
|
Step 3. Component & Html
接著我們定義城市的進入點,index.html 及 app.js:
src/index.html 1 2 3 4 5 6 7 8 9 10 11
| <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Hello React</title>
</head> <body> <script src="/app.js"></script> </body> </html>
|
src/app.js1 2 3 4 5 6 7 8 9 10 11
| var React = require('react');
var App = React.createClass({ render() { return ( <div>React Example</div> ); } });
React.render(<App />, document.body);
|
react 的 javascript 寫法,也可以寫成:
src/app.js1
| React.render(<div>React Example</div>, document.body);
|
Step 4. More Components
React Component 最重要的功能就是複用 (Reuse) 、組合 (Compose) 的特性。可以接元件切成比較小的部分,再用引入的方式使用。
src/app.js1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| var React = require('react');
var Hello = require('./Hello.js');
var App = React.createClass({ render() { return ( <div> <div>React Example</div> <Hello name="World"/> <Hello name="You"/> </div> ); } });
React.render(<App />, document.body);
|
src/hello.js1 2 3 4 5 6 7 8 9 10 11 12 13
| var React = require('react'); var Hello = React.createClass({ render() { return ( <div> Hello, {this.props.name}! </div> ); } });
module.exports = Hello;
|
Step 5. 執行
我們使用 webpack-dev-server 執行程式,它可以在有修改到程式碼時,自動進行打包的動作,而且它會自動重新載入,所以你也不用在瀏覽器中一直按重新載入。
也可以將 webpack-dev-server 這一段寫在 package 內,就可以直接使用 npm script 執行。
package.json1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| { "name": "react-example", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "webpack-dev-server --progress --hot --inline" }, "author": "", "license": "ISC", "dependencies": { "react": "^0.14.7" }, "devDependencies": { "babel-core": "^6.7.2", "babel-loader": "^6.2.4", "babel-plugin-react-transform": "^2.0.2", "babel-preset-es2015": "^6.6.0", "babel-preset-react": "^6.5.0", "file-loader": "^0.8.5", "react-transform-hmr": "^1.0.4", "webpack": "^1.12.14", "webpack-dev-server": "^1.14.1" } }
|
Reference
[1] React with webpack - part 1
[2] 設定開發React的環境
[3] 使用 Webpack 建立 React 專案開發環境
[4] 深入浅出React(二):React开发神器Webpack
License
本著作由 Chang, Wei-Yaun (v123582) 製作,
以創用CC 姓名標示-相同方式分享 3.0 Unported授權條款釋出。