React 環境部屬

這一篇文章將介紹如何初始化一個 React 專案。React 使用了 CommonJS modules 的技術,需要透過 Javascript bundler 將 檔案重新打包成 javascript ,才可以在網頁的中使用的。而在 react 中,webpack 是主流的工具。React 的語法是一種「針對 ECMAScript 的自創語法」,瀏覽器也沒辦法直接支援,所以也要靠 babel 先編譯完成。在本篇文章中,我們主要利用 Webpack 作為 bundler,及 babel 做完語法的轉譯工具。

程式碼放在:github

Webpack

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 --save
$ npm install webpack webpack-dev-server --save-dev
$ npm install babel-loader babel-core babel-preset-es2015 babel-preset-react --save-dev
$ npm install file-loader --save-dev
$ npm install babel-plugin-react-transform --save-dev
$ npm install react-transform-hmr --save-dev

Step 2. 設定

webpack.config.js 用來設定 webpack 的基礎設定,裡如:要打包在哪裡的檔案,然後輸出在哪裡。 context 設定程式碼的位置,entry 表示進入點。output 則是放檔案產出的位置。module loaders 設定不同的檔案需要使用哪些 loader 轉譯跟打包。

webpack.config.js
1
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 內。

.babelrc
1
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.js
1
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.js
1
React.render(<div>React Example</div>, document.body);

Step 4. More Components

React Component 最重要的功能就是複用 (Reuse) 、組合 (Compose) 的特性。可以接元件切成比較小的部分,再用引入的方式使用。

src/app.js
1
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.js
1
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 執行。

1
$ npm start
package.json
1
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授權條款釋出。