(转)React几种基本配置方案

学习React应该基于创建项目特定类型的设置细节之上(比如Webpack、Redux、ES6、JSX、Babel等),而不是一下子就去忙于理解所有的设置项。

在这篇文章中列出了有关于React方面的七种设置。大部分的设置我都将会向大家展示,但总的来说,这并不困难。接下来的内容从简单到复杂,介绍React的设置。

方法1:只使用React,不使用JSX

如果在React项目中决定不使用JSX,又想渲染HTML DOM。那么在准备写React代码之前,在你的HTML页面需要引入一个react.jsreact-dom.js文件。

react.js文件是创建React节点和组件所需要的核心文件。当你打算在一个HTML中渲染一个组件(比如DOM)还需要react-dom.js文件。react-dom.js文件依赖于react.js文件,所以在引入react-dom.js文件之前要先引入react.js文件。比如下面的示例:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>React</title>
 6     <script src="./src/js/react.js"></script>
 7     <script src="./src/js/react-dom.js"></script>
 8 </head>
 9 <body>
10
11 </body>
12 </html>

在HTML页面中使用react.jsreact-dom.js文件,就可以创建React节点或组件,然后渲染成DOM。接下来创建一个名叫HelloMessage的React组件,并且放到<div>的React节点中,最后渲染到<div id="app"></div>的HTML元素内。

 1 <body>
 2     <div id="app"></div>
 3     <script>
 4         var HelloMessage = React.createClass ({
 5             displayName: "HelloMessage",
 6             render: function render () {
 7                 return React.createElement("div", null, "Hello ", this.props.name);
 8             }
 9         });
10         ReactDOM.render(React.createElement(HelloMessage, {name: "John"}), document.getElementById("app"));
11     </script>
12 </body>

这样使用不需利用JSX或ES 2015。

方法2:通过browser.js转换JSX/ES 2015(非生产设置)

可以按前面的方式,在HTML页面中添加一个额外的脚本,允许使用JSX/ES2015。然后在客户端使用Babel来转换JSX并不是一个适于生产。在客户端运行时处理JSX/ES2015时负担很重,但对于非生产环境下在HTML中添加browser.js文件,可以在客户端中运行时转换JSX。

在HTML页面中使用JSX来实现前面示例中HelloMessage组件:

 1 <body>
 2     <div id="app"></div>
 3     <script type="text/babel">
 4         const HelloMessage = React.createClass({
 5             render: function (){
 6                 return <div>Hello {this.props.name}</div>;
 7             }
 8         });
 9         ReactDOM.render(<HelloMessage name="Jhon" />, document.getElementById("app"));
10     </script>
11 </body>

代码的转换发生了,那是因为我们引入了browser.js的Babel文件,并且给<script>元素设置type属性的值为type="text/babel"。当browser.js加载后将找到有关于type="text/babel"的脚本,并且将JSX/ES2015转换成ES5 JavaScript。例如,下面代码就是转换后的代码:

 1 var HelloMessage = React.createClass({
 2     displayName: "HelloMessage",
 3
 4     render: function render() {
 5         return React.createElement(
 6             "div",
 7             null,
 8             "Hello ",
 9             this.props.name
10         );
11     }
12 });
13
14 ReactDOM.render(React.createElement(HelloMessage, { name: "John" }), document.getElementById(‘app‘));

注意,对于Babel项目,使用Babel6将不再需要提供browser.js就可以将JSX代码转换成ES5代码。因此,如果你使用的是老版本的Babel(比如5.8.23版本),需要提供browser.js文件转换JSX/ES*。

方法3:通过system.js/browser.js在浏览器中转找JSX/ES 2015(非生产设置)

接下来可能让你有所激动,至少我是这样。通过jspm CDN加载SystemJS,在运行浏览器时将会解决有关于React,JSX和Babel(比如动态加载)的一些细节。

你所需要做的就是提供下面这样的一个HTML文件:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6     <script src="https://jspm.io/[email protected]"></script>
 7     <script>
 8         System.config({
 9             transpiler: "babel",
10             babelOptions: {}
11         });
12         System.import(‘./main.js‘);
13     </script>
14 </head>
15 <body>
16
17 </body>
18 </html>

main.js文件中引入所需要依赖的文件:

1 import React from "react"
2 import ReactDOM from "react-dom"
3
4 const Hello = ({name}) => <h1>Hello {name}!</h1>
5
6 ReactDOM.render(
7     <Hello name={"dude"} />,
8     document.body.appendChild(document.createElement("div"))
9 )

你不需要安装或下载任何文件就能正常运行。当页面加载之后,它将获得所有必要的依赖关系,包括Babel。可以通过Chrome的开发者工具中的"source"面板查看到所加载的一切:

jspn CDN工作原理就类似于npmcdn.com。使用depCache injnection发送压缩后源码覆盖HTTP/2,使用这种方法可能适合在生产环境中使用。

现在你可能想这只会使用名为jspm包(即jspm注册表中定义过的包),其实你错了。你可以绕过jspm,通过npm来安装包。当然,你必须通过一个package.json文件告诉jspm你要安装的包。例如你可以使用这种方式安装ES 2015模块。

1 import picturefill from ‘github:scottjehl/picturefill‘
2 import async from ‘npm:async‘

这些开发算是强大的,但在生产中也有一些潜在的未知工具,比如SPDYHTTP/2

方法4:使用在线编辑器创建React

当你需要快速设置React,并且分享React的“伪代码”(pseudocode),你可在在线编辑器(比如,jsbin或jsfiddle)上操作,比如前面的一些设置都可以在上面编辑。

最快和最容易的设置React可以使用JS Bin在线编辑器等。

方法5:在开发过程中使用Babel-cli和npm转换JSX/ES 2015

在整个代码开发过程中,可以使用Babel-cli、Bable预设/插件和npm将JSX/ES 2015代码转成ES5代码。

接下来分七个步骤来介绍整个实现过程。或者使用Github上预设的代码根据下面四个步骤来完成整个设置。

  • 克隆/下载整个代码
  • 遵循下面的步骤一
  • 在克隆下来的项目目录下运行npm install
  • 遵循下面的最后一步

第一步:确定安装了node.js和npm,然后安装全局packages

在这一步中,确保你已经安装了node.jsnpm,并且确保其版本是最新的稳定版本。然后运行下面的命令安装browser-sync

 1 npm install browser-sync -g 

如果安装全局的包有可能需要在命令前添加sudo

第二步:创建目录和文件

在你本地文件系统中创建目录并且按照下面的方式创建子目录和文件:

├── index.html
├── build
├── src
│    └── app.js
└── package.json

打开package.json文件,并且创建一个空的JSON对象:

{

}

第三步:通过npm安装依赖关系

在第二步创建的根目录下运行下面的npm命令:

 npm install babel-cli babel-preset-es2015 babel-preset-react babel-preset-stage-0 browser-sync --save-dev 

和:

 npm install react react-dom --save 

运行上面两行命令将会安装必要的npm包。现在根目录中增加了一个node_modules文件夹,并且需要的npm包都放在这个文件夹下:

├── index.html
├── build
├── src
│   └── app.js
├── node_modules
│   ├── babel-cli
│   ├── babel-preset-es2015
│   ├── babel-preset-react
│   ├── babel-preset-stage-0
│   ├── browser-sync
│   ├── react
│   └── react-dom
└── package.json

第四步:配置Babel和npm

打开package.json文件,你看到的样子像下面这样:

{
  "devDependencies": {
    "babel-cli": "^6.9.0",
    "babel-preset-es2015": "^6.9.0",
    "babel-preset-react": "^6.5.0",
    "babel-preset-stage-0": "^6.5.0",
    "browser-sync": "^2.12.8"
  },
  "dependencies": {
    "react": "^15.1.0",
    "react-dom": "^15.1.0"
  }
}

package.json文件中添加Babel和脚本配置:

{
    "scripts": {
        "babel": "babel src --out-dir build -w",
        "server": "browser-sync --port 4000 start --server --files \"**/*.html\" \"**/*.css\" \"build/**/*.js\" "
    },
    "babel": {
        "presets": [
            "es2015",
            "react"
        ],
        "sourceMaps": false
    },
    "devDependencies": {
        "babel-cli": "^6.9.0",
        "babel-preset-es2015": "^6.9.0",
        "babel-preset-react": "^6.5.0",
        "babel-preset-stage-0": "^6.5.0",
        "browser-sync": "^2.12.8"
    },
    "dependencies": {
        "react": "^15.1.0",
        "react-dom": "^15.1.0"
    }
}

运行npm cli,更新Babel配置,并且提供两个script

第五步: 更新index.html

打开index.html文件,并且将下面的代码复制到HTML文件中:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>React via Babel</title>
 6     <script src="node_modules/react/dist/react.js"></script>
 7     <script src="node_modules/react-dom/dist/react-dom.js"></script>
 8 </head>
 9 <body>
10     <div id="app"></div>
11     <script src="build/app.js"></script>
12 </body>
13 </html>

注意:从node_modules目录中添加react.jsreact-dom.js文件。

第六步:更新app.js

打开app.js文件,并且将下面的JavaScript代码复制到app.js文件中:

1 const HelloMessage = React.createClass({
2     render: function() {
3         return <div > Hello { this.props.name } < /div>;
4     }
5 });
6
7 ReactDOM.render( < HelloMessage name = "John" / > , document.getElementById(‘app‘));

第七步:运行Babel和Server

在根目录下运行下面的命令:

npm run babel

运行这两行命令开发的代码就能跑起来了。

如果你遵循所有的步骤操作,并且没有出错的话,那么Browsersync应该会打开浏览器在http://localhost:4000这个地址上加载index.htmlapp.js。Babel和Browsersync会运行所做的修改。

这个设置不是根据你想要创建一个SPA构建的,而是假定你想利用JSX和ES 2015创建HTML页面。

方法6:通过Webpack和Babel-core在开发过程中转换JSX/ES 2015

这个设置是使用Webpack和几个加载器将JSX/ES 2015代码转换成ES5代码。通过使用Webpack,JavaScript模块可以使用ES2015模块加载格式、属性转换和捆绑。

将通过下面七个步骤来完成整个配置。或者从GitHub仓库中预载配置下,按下面的四步完成整个配置。

  • 克隆/下载整个代码
  • 根据下面的第一步做相应操作
  • 在克隆下来的项目目录下运行npm install命令
  • 根据下面的最后一步做相应操作

第一步:确定安装了node.js和npm,然后安装全局packages

在这一步中,确保你已经安装了node.jsnpm,并且确保其版本是最新的稳定版本。然后运行下面的命令安装Webpackbrowser-sync

npm install webpack browser-sync -g

有可能全局安装需要在命令前添加“sudo”。

第二步:创建目录和文件

在本地项目中创建需要目录,并且在其下面创建子目录和文件。

├── build
├── index.html
├── package.json
├── src
│   ├── app.js
│   ├── app.css
│   └── math.js
└── webpack.config.js

打开package.json文件,并且创建一个空的JSON对象:

{

}

第三步:通过npm安装依赖关系

在第二步创建的根目录下运行下面的npm命令安装所需要的依赖关系:

npm install babel-core babel-loader babel-preset-es2015 babel-preset-react babel-preset-stage-0 browser-sync css-loader extract-text-webpack-plugin style-loader webpack --save-dev

接下来运行:

 npm install react react-dom @telerik/kendo-react-buttons --save 

运行上面两行命令将会安装必要的npm包。现在根目录中增加了一个node_modules文件夹,并且将需要的npm包都放在这个文件夹下:

├── build
├── index.html
├── node_modules
│   ├── @telerik
│   ├── babel-core
│   ├── babel-loader
│   ├── babel-preset-es2015
│   ├── babel-preset-react
│   ├── babel-preset-stage-0
│   ├── browser-sync
│   ├── css-loader
│   ├── extract-text-webpack-plugin
│   ├── react
│   ├── react-dom
│   ├── style-loader
│   └── webpack
├── package.json
├── src
│   ├── app.js
│   ├── app.css
│   └── math.js
└── webpack.config.js

第四步:更新app.js,app.css,math.js和index.html

打开app.js文件,并且添加下面的代码:

 1 import React from ‘react‘;
 2 import ReactDOM from ‘react-dom‘;
 3 import * as KendoReactButtons from ‘@telerik/kendo-react-buttons‘;
 4 import ‘@telerik/kendo-react-buttons/dist/npm/css/main.css‘;
 5 import { square, diag } from ‘./math.js‘;
 6 import ‘./app.css‘;
 7
 8 console.log(square(11)); // 121
 9 console.log(diag(4, 3)); // 5
10
11 class ButtonContainer extends React.Component {
12     constructor(props) {
13         super(props);
14         this.state = {
15             disabled: false
16         };
17     }
18     onClick = () => {
19         this.setState({ disabled: !this.state.disabled });
20     }
21     render() {
22         return (
23             <div>
24                 <KendoReactButtons.Button onClick={this.onClick}>Button 1</KendoReactButtons.Button>
25                 <KendoReactButtons.Button disabled={this.state.disabled}>Button 2</KendoReactButtons.Button>
26             </div>
27         );
28     }
29 }
30
31 ReactDOM.render(
32     <div>
33         <p>Button</p>
34         <KendoReactButtons.Button>Button test</KendoReactButtons.Button>
35         <p>Disabled Button</p>
36         <KendoReactButtons.Button disabled>Button</KendoReactButtons.Button>
37         <p>Primary Button</p>
38         <KendoReactButtons.Button primary>Primary Button</KendoReactButtons.Button>
39         <p>Button with icon</p>
40         <KendoReactButtons.Button icon="refresh">Refresh</KendoReactButtons.Button>
41         <p>Button with icon (imageUrl)</p>
42         <KendoReactButtons.Button imageUrl="http://demos.telerik.com/kendo-ui/content/shared/icons/sports/snowboarding.png">Snowboarding</KendoReactButtons.Button>
43         <p>Button with a custom icon (iconClass) [FontAwesome icon]</p>
44         <KendoReactButtons.Button iconClass="fa fa-key fa-fw">FontAwesome icon</KendoReactButtons.Button>
45         <p>Toggleable Button</p>
46         <KendoReactButtons.Button togglable>Togglable button</KendoReactButtons.Button>
47         <p>onClick event handler</p>
48         <ButtonContainer />
49     </div>,
50     document.getElementById(‘app‘)
51 );

打开app.css文件,并且添加下面的代码:

body{
    margin:50px;
}

打开math.js文件,并且添加下面的代码:

export const sqrt = Math.sqrt;

export function square(x) {
    return x * x;
}
export function diag(x, y) {
    return sqrt(square(x) + square(y));
}

打开index.html文件,并且添加下面的代码:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Webpack</title>
 6     <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
 7     <link rel="stylesheet" type="text/css" href="./build/style.css">
 8 </head>
 9 <body>
10     <div id="app"></div>
11     <script src="./build/appBundle.js"></script>
12 </body>
13 </html>

第五步:更新webpack.config.js

打开webpack.config.js文件,并且添加下面的代码:

var path = require(‘path‘);
var ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
    entry: [‘./src/app.js‘],
    output: {
        path: path.resolve(__dirname, ‘build‘),
        filename: ‘appBundle.js‘
    },
    module: {
        loaders: [{
            test: /\.css$/,
            loader: ExtractTextPlugin.extract("style-loader", "css-loader")
        }, {
            loader: ‘babel-loader‘,
            exclude: /node_modules/,
            test: /\.js$/,
            query: {
                presets: [‘es2015‘, ‘react‘, ‘stage-0‘],
            },
        }]
    },
    plugins: [
        new ExtractTextPlugin("style.css", {
            allChunks: true
        })
    ]
};

第六步:更新package.json

打开package.json文件,你可以看到文件中包括像下面这样的代码:

{
  "devDependencies": {
    "babel-core": "^6.9.0",
    "babel-loader": "^6.2.4",
    "babel-preset-es2015": "^6.9.0",
    "babel-preset-react": "^6.5.0",
    "babel-preset-stage-0": "^6.5.0",
    "browser-sync": "^2.12.8",
    "css-loader": "^0.23.1",
    "extract-text-webpack-plugin": "^1.0.1",
    "style-loader": "^0.13.1",
    "webpack": "^1.13.1"
  },
  "dependencies": {
    "@telerik/kendo-react-buttons": "^0.1.0",
    "react": "^15.1.0",
    "react-dom": "^15.1.0"
  }
}

更且在package.json文件中添加scripts相关配置:

{
    "scripts": {
        "webpack": "webpack --watch",
        "server": "browser-sync --port 4000 start --server --files \"**/*.html\" \"build/**/*.css\" \"build/**/*.js\" "
    },
    "devDependencies": {
        "babel-core": "^6.9.0",
        "babel-loader": "^6.2.4",
        "babel-preset-es2015": "^6.9.0",
        "babel-preset-react": "^6.5.0",
        "babel-preset-stage-0": "^6.5.0",
        "browser-sync": "^2.12.8",
        "css-loader": "^0.23.1",
        "extract-text-webpack-plugin": "^1.0.1",
        "style-loader": "^0.13.1",
        "webpack": "^1.13.1"
    },
    "dependencies": {
        "@telerik/kendo-react-buttons": "^0.1.0",
        "react": "^15.1.0",
        "react-dom": "^15.1.0"
    }
}

第七步:运行webpack和server

在你项目根目录下运行下面的npm命令:

npm run webpack

同时打开另一个命令窗口运行下面的npm命令:

npm run server

运行这两行命令开发的代码就能跑起来了。

如果你遵循所有的步骤操作,并且没有出错的话,那么Browsersync应该会打开浏览器在http://localhost:4000这个地址上加载index.htmlapp.js。Webpack和Browsersync会运行所做的修改。

这只是设置中的冰山一角。根据您正在构建的应用程序的范围和规模,这个Webpack设置只是最基本的,你可以在很多方面进行配置和重新配置。完全可以从这个基本的配置开始,然后深入学习Webpack。

方法7:通过Babel-core和SystemJs/jspm.io在开发中转换JSX/ES 2015

这个React设置使用SystemJs/jspm-cli转换JSX/ES 2015,加载、和捆绑JavaScript模块和CSS样式。

我想我已经把最好的方案留到最后面了。主要是因为SystemJS/jspm处理配置文件和通过cli的解决方案将是未来的趋势。

接下来通过下面九个步骤来完成整个配置。或者从GitHub仓库中下载已经预设好的配置,并且按下面的四个步骤完成整个配置。

  • 克隆/下载整个代码
  • 遵循下面的步骤一操作
  • 在克隆下来的项目目录下运行npm install && jspm
  • 遵循下面的步骤八操作

步骤一:确保安装node.jsnpm,然后安装全局packages

在这一步中,确保你已经安装了node.jsnpm,并且确保其版本是最新的稳定版本。然后运行下面的命令安装jspmbrowser-sync

npm install jspm browser-sync -g

步骤二:创建文件夹和文件

在你的本地创建项目目录并且在其下面创建相关的子目录和文件:

├── app.js
├── index.html
├── js
│   └── math.js
├── package.json
└── style
    └── app.css

打开package.json文件,并且创建一个空的JSON对象:

{

}

步骤三:安装npm依赖关系

在根目录下运行下面的命令:

npm install jspm browser-sync --save-dev

运行上面命令将会安装必要的npm包。现在项目根目录下添加了node_modules和相应的npm包:

├── app.js
├── index.html
├── js
│   └── math.js
├── node_modules
│   ├── browser-sync
│   └── jspm
├── package.json
└── style
    └── app.css

步骤四:初始化SystemJS/JSPM设置

在你项目根目录下运行下面的jspm-cli命令:

jspm init

将会问你9个问题,每个问题你只需要按回车键就行了。

Package.json file does not exist, create it? [yes]:
Would you like jspm to prefix the jspm package.json properties under jspm? [yes]:
Enter server baseURL (public folder path) [./]:
Enter jspm packages folder [./jspm_packages]:
Enter config file path [./config.js]:
Configuration file config.js doesn‘t exist, create it? [yes]:
Enter client baseURL (public folder URL) [/]:
Do you wish to use a transpiler? [yes]:
Which ES6 transpiler would you like to use, Babel, TypeScript or Traceur? [babel]:

将会在根目录创建一个config.js文件和一个jspm_packagees文件夹。这时项目的目录结构像这样:

├── app.js
├── config.js
├── index.html
├── js
│   └── math.js
├── jspm_packages
│   ├── github
│   ├── npm
│   ├── system-csp-production.js
│   ├── system-csp-production.js.map
│   ├── system-csp-production.src.js
│   ├── system-polyfills.js
│   ├── system-polyfills.js.map
│   ├── system-polyfills.src.js
│   ├── system.js
│   ├── system.js.map
│   └── system.src.js
├── node_modules
│   ├── browser-sync
│   └── jspm
├── package.json
└── style
    └── app.css

打开config.js文件,并且更新babelOptions对象,将下面的代码:

babelOptions: {
    "optional": [
        "runtime",
        "optimisation.modules.system"
    ]
},

更新为:

babelOptions: {
    "optional": [
      "runtime",
      "optimisation.modules.system"
    ],
    "stage": 0
},

步骤五: 更新app.js,app.css,math.js和index.html

打开app.js文件,并且添加下面的代码:

 1 import ‘./style/app.css!‘; //note, had to add the !
 2 import React from ‘react‘;
 3 import ReactDOM from ‘react-dom‘;
 4 import * as KendoReactButtons from ‘@telerik/kendo-react-buttons‘;
 5 import ‘@telerik/kendo-react-buttons/dist/npm/css/main.css!‘; //note, had to add the !
 6 import { square, diag } from ‘./js/math.js‘;
 7
 8 console.log(square(11)); // 121
 9 console.log(diag(4, 3)); // 5
10
11 class ButtonContainer extends React.Component {
12     constructor(props) {
13         super(props);
14         this.state = {
15             disabled: false
16         };
17     }
18     onClick = () => {
19         this.setState({ disabled: !this.state.disabled });
20     }
21     render() {
22         return (
23             <div>
24                 <KendoReactButtons.Button onClick={this.onClick}>Button 1</KendoReactButtons.Button>
25                 <KendoReactButtons.Button disabled={this.state.disabled}>Button 2</KendoReactButtons.Button>
26             </div>
27         );
28     }
29 }
30
31 ReactDOM.render(
32     <div>
33         <p>Button</p>
34         <KendoReactButtons.Button>Button test</KendoReactButtons.Button>
35         <p>Disabled Button</p>
36         <KendoReactButtons.Button disabled>Button</KendoReactButtons.Button>
37         <p>Primary Button</p>
38         <KendoReactButtons.Button primary>Primary Button</KendoReactButtons.Button>
39         <p>Button with icon</p>
40         <KendoReactButtons.Button icon="refresh">Refresh</KendoReactButtons.Button>
41         <p>Button with icon (imageUrl)</p>
42         <KendoReactButtons.Button imageUrl="http://demos.telerik.com/kendo-ui/content/shared/icons/sports/snowboarding.png">Snowboarding</KendoReactButtons.Button>
43         <p>Button with a custom icon (iconClass) [FontAwesome icon]</p>
44         <KendoReactButtons.Button iconClass="fa fa-key fa-fw">FontAwesome icon</KendoReactButtons.Button>
45         <p>Toggleable Button</p>
46         <KendoReactButtons.Button togglable>Togglable button</KendoReactButtons.Button>
47         <p>onClick event handler</p>
48         <ButtonContainer />
49     </div>,
50     document.getElementById(‘app‘)
51 );

打开app.css文件,并且添加下面的代码:

body{
    margin:50px;
}

打开math.js文件,并且添加下面的代码:

export const sqrt = Math.sqrt;

export function square(x) {
    return x * x;
}
export function diag(x, y) {
    return sqrt(square(x) + square(y));
}

打开index.html文件,并且添加下面的代码:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>systemJS/jspm</title>
 6     <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
 7 </head>
 8 <body>
 9     <div id="app"></div>
10     <script src="jspm_packages/system.js"></script>
11     <script src="config.js"></script>
12     <script>
13             System.import(‘app.js‘);
14     </script>
15 </body>
16 </html>

步骤六: 使用jspm-cli安装开发包

在你项目根目录下运行下面的jspm-cli命令:

jspm install react react-dom css npm:@telerik/kendo-react-buttons

上面的命令将在jspm_packagees目录下安装React,react-dom,jspm css插件和Kendo UI React按钮。这些依赖关系将会放到package.json文件中。另外,jspm配置文件也将会对应更新,以便安装需要的安装包,而且不需要手动更新config.js文件。

更新后的jspm_packagees目录结构看起来像下面这样:

├── jspm_packages
│   ├── github
│   │   ├── jspm
│   │   └── systemjs
│   ├── npm
│   │   ├── @telerik
│   │   ├── [email protected]0.2.1
│   │   ├── [email protected]0.2.1.js
│   │   ├── [email protected]2.0.3
│   │   ├── [email protected]2.0.3.js
│   │   ├── [email protected]1.3.0
│   │   ├── [email protected]1.3.0.js
│   │   ├── babel[email protected]
│   │   ├── babel[email protected].js
│   │   ├── babel[email protected]
│   │   ├── base64-j[email protected]
│   │   ├── base64[email protected].js
│   │   ├── browserify[email protected]
│   │   ├── browserify[email protected].js
│   │   ├── [email protected]3.6.0
│   │   ├── [email protected]3.6.0.js
│   │   ├── [email protected]2.2.5
│   │   ├── [email protected]2.2.5.js
│   │   ├── core[email protected]
│   │   ├── core[email protected].js
│   │   ├── core[email protected]
│   │   ├── core[email protected].js
│   │   ├── domain[email protected]
│   │   ├── domain[email protected].js
│   │   ├── [email protected]0.1.12
│   │   ├── [email protected]0.1.12.js
│   │   ├── [email protected]1.0.2
│   │   ├── [email protected]1.0.2.js
│   │   ├── [email protected]0.6.1
│   │   ├── [email protected]0.6.1.js
│   │   ├── [email protected]0.8.2
│   │   ├── [email protected]0.8.2.js
│   │   ├── https[email protected]
│   │   ├── https[email protected].js
│   │   ├── iconv[email protected]
│   │   ├── iconv[email protected].js
│   │   ├── [email protected]1.1.6
│   │   ├── [email protected]1.1.6.js
│   │   ├── [email protected]2.0.1
│   │   ├── [email protected]2.0.1.js
│   │   ├── is[email protected]
│   │   ├── is[email protected].js
│   │   ├── [email protected]0.0.1
│   │   ├── [email protected]0.0.1.js
│   │   ├── [email protected]1.0.0
│   │   ├── [email protected]1.0.0.js
│   │   ├── isomorphic[email protected]
│   │   ├── isomorphic[email protected].js
│   │   ├── js[email protected]
│   │   ├── js[email protected].js
│   │   ├── loose[email protected]
│   │   ├── loose[email protected].js
│   │   ├── node[email protected]
│   │   ├── node[email protected].js
│   │   ├── object[email protected]
│   │   ├── object[email protected].js
│   │   ├── [email protected]0.2.8
│   │   ├── [email protected]0.2.8.js
│   │   ├── path[email protected]
│   │   ├── path[email protected].js
│   │   ├── process[email protected]
│   │   ├── process[email protected].js
│   │   ├── [email protected]0.11.3
│   │   ├── [email protected]0.11.3.js
│   │   ├── [email protected]7.1.1
│   │   ├── [email protected]7.1.1.js
│   │   ├── [email protected]1.3.2
│   │   ├── [email protected]1.3.2.js
│   │   ├── [email protected]0.2.0
│   │   ├── [email protected]0.2.0.js
│   │   ├── react[email protected]
│   │   ├── react[email protected].js
│   │   ├── react[email protected]
│   │   ├── react[email protected].js
│   │   ├── [email protected]0.14.8
│   │   ├── [email protected]0.14.8.js
│   │   ├── [email protected]15.0.2
│   │   ├── [email protected]15.0.2.js
│   │   ├── readable[email protected]
│   │   ├── readable[email protected].js
│   │   ├── readable[email protected]
│   │   ├── readable[email protected].js
│   │   ├── stream[email protected]
│   │   ├── stream[email protected].js
│   │   ├── [email protected]0.10.31
│   │   ├── [email protected]0.10.31.js
│   │   ├── ua[email protected]
│   │   ├── ua[email protected].js
│   │   ├── [email protected]0.10.3
│   │   ├── [email protected]0.10.3.js
│   │   ├── util[email protected]
│   │   ├── util[email protected].js
│   │   ├── [email protected]0.10.3
│   │   ├── [email protected]0.10.3.js
│   │   ├── whatwg[email protected]
│   │   └── whatwg[email protected].js
│   ├── system-csp-production.js
│   ├── system-csp-production.js.map
│   ├── system-csp-production.src.js
│   ├── system-polyfills.js
│   ├── system-polyfills.js.map
│   ├── system-polyfills.src.js
│   ├── system.js
│   ├── system.js.map
│   └── system.src.js

步骤七: 更新package.json

打开package.json文件,代码看起来像下面这样:

{
  "devDependencies": {
    "browser-sync": "^2.12.8",
    "jspm": "^0.16.35"
  },
  "jspm": {
    "dependencies": {
      "@telerik/kendo-react-buttons": "npm:@telerik/[email protected]^0.1.0",
      "css": "github:systemjs/[email protected]^0.1.22",
      "react": "npm:[email protected]^15.1.0",
      "react-dom": "npm:[email protected]^15.1.0"
    },
    "devDependencies": {
      "babel": "npm:[email protected]^5.8.24",
      "babel-runtime": "npm:[email protected]^5.8.24",
      "core-js": "npm:[email protected]^1.1.4"
    }
  }
}

package.json文件中添加scripts相关配置:

{
    "scripts": {
        "bundle": "jspm bundle app.js --inject",
        "unBundle": "jspm unbundle",
        "server": "browser-sync --port 4000 --no-inject-changes start --server --files \"**/*.html\" \"style/**/*.css\" \"js/**/*.js\" "
    },
    "devDependencies": {
        "browser-sync": "^2.12.8",
        "jspm": "^0.16.35"
    },
    "jspm": {
        "dependencies": {
            "@telerik/kendo-react-buttons": "npm:@telerik/[email protected]^0.1.0",
            "css": "github:systemjs/[email protected]^0.1.22",
            "react": "npm:[email protected]^15.1.0",
            "react-dom": "npm:[email protected]^15.1.0"
        },
        "devDependencies": {
            "babel": "npm:[email protected]^5.8.24",
            "babel-runtime": "npm:[email protected]^5.8.24",
            "core-js": "npm:[email protected]^1.1.4"
        }
    }
}

步骤八:运行服务器

在你项目根目录下运行下面的jspm-cli命令:

npm run server

如果你遵循所有的步骤操作,并且没有出错的话,那么Browsersync应该会打开浏览器在http://localhost:4000地址将加载index.htmlapp.js文件。而且所做的任何修改Browsersync将会自动刷新浏览器。

步骤九:捆绑模式

SystemJS/jspm提供了一个捆绑模式。打开一个新的命令窗口,并且在项目根目录下运行下面的npm命令:

npm run bundle

如果要解除捆绑模式,可以执行下面的命令:

npm run unBundle

开始使用React

希望上面这七种有关于React的开发配置对你学习React有所帮助。一切学习都是从最基本的开始,掌握了基础配置之后,就可以在这个配置环境上使用React,然后学习有关于React更复杂的技能。

时间: 2024-08-03 06:18:41

(转)React几种基本配置方案的相关文章

Session和几种状态保持方案理解

一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的. session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session.有时候我们可以看到这样的话"在一个浏览器会话期间,...",这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间①.最混乱的是

web.config中sessionState节点的配置方案

web.config中sessionState节点的配置方案 web.config关于sessionState节点的配置方案,sessionState有五种模式:Custom,off,inProc,StateServer,SqlServer. 1.Custom模式  会话状态将使用自定义数据存储区来存储会话状态信息. 2.off模式 从字面上就可以看出这个是关闭模式,如果当前页面不需要session的值,为了减少服务器资源,你可以去掉Session的开销. <sessionState mode=

虚拟机的网络配置方案

宿主机(windows)和客户机(虚拟机)网络连接 推荐使用第一种. 1.host-only(仅主机模式):宿主机与客户机单独组网(用的是网络连接中的VMnet1,所以宿主机的vm1要开启) 好处:和真实网络隔离 坏处:虚拟机与其他服务器之间不能通信 可以设置虚拟机成静态ip,这样ip就永远不会变了,网关要用vm1的ip地址:vm1的ip也是静态的不会变:我做编程虚拟机不上网用这个很实用,ip永远不会变,连虚拟机方便,我通常是将不常用的大软件安装到虚拟机,外部通过ip访问,如oracle.mss

tomcat集群配置方案对比

Tomcat集群配置方案大体上可以分为两种配置方案:共享Session型与不同享Session型.当然,其中各有千秋,如果不共享需要上层需要有一定结构进行一致化路由.何谓一致化路由,简单来讲,就是你上次怎么走路,这次还是怎么走,实现的方式有很多种,例如直接按照nginx进行来源或者目的ip进行相应的hash,dns进行地域划分等等,只要能保证上一次和下一次踏入的是"同一条河流"即可. 另一方面,如果不共享需要有一定机制进行共享Session机制,此时共享一般分为两种,找个第三方存储Se

LoadRunner配置方案

1.配置方案运行时设置 选择“Tools”>“Options”.在“Options”对话框有“Run-Time Settings”(运行时设置).“Timeout”(超时).“Run-Time File Storage”(运行时文件存储).“Path Translation Table”(路径转换表)等选项卡. (1)“Run-Time Settings”选项卡 “Run-Time Settings”(运行时设置)选项卡如图2-52所示. ● Vuser Quota(Vuser配额):要防止系统

echarts解决一些大屏图形配置方案汇总

本文主要记录使用echarts解决各种大屏图形配置方案. 1.说在前面 去年经常使用echarts解决一些可视化大屏项目,一直想记录下使用经验,便于日后快速实现.正好最近在整理文档,顺道一起记录在博客中.详见:http://webhmy.com/2018/06/23/echarts/ 2.基本使用 Echarts3.0是通过配置实现图形的,根据不同的配置或者组合配置生成想要的图形.后面主要介绍options中的配置内容. setOption // dom表示对应的dom节点,必须指定宽高 var

[&#128175;原]IOS之Objectic-C的单例的两种安全实现方案

所有转出博客园,请您注明出处:http://www.cnblogs.com/xiaobajiu/p/4122034.html Objectic-C的单例的两种安全实现方案 首先应该知道单例的实现有两大类,一个是懒汉式,一个是饿汉式.所谓的懒汉式就是在我们用到某对象(资源)的时候,去问一个负责提供的方法要那个对象.那个方法发现没有这个资源时就去创建资源,如果是已经有该资源时就直接返回这个资源.而饿汉式就是那个负责提供的方法早已为我们准备好了我们想要的资源问它,它就提供给我们那个它早就准备好了的资源

最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)

导读 1. 什么是序列化? 2. 为什么要序列化?好处在哪里? 3. C++对象序列化的四种方法 4. 最常用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯.这个将 程序数据转化成能被存储并传输的格式的过程被称为"序列化"(Serialization),而它的逆过程则可被称为"反序列化" (Deserialization). 简单

转:JavaScript Promises相当酷:一种有趣的方案库

许多的语言,为了将异步模式处理得更像平常的顺序,都包含一种有趣的方案库,它们被称之为promises,deferreds,或者futures.JavaScript的promises ,可以促进关注点分离,以代替紧密耦合的接口. 本文讲的是基于Promises/A 标准的JavaScript promises.[http://wiki.commonjs.org/wiki/Promises/A]Promise的用例: 执行规则 多个远程验证 超时处理 远程数据请求 动画 将事件逻辑从应用逻辑中解耦