Material-UI 是一套用React写成的,符合Google Material Design 的UI组件库。
此库在编写的时候用到了ES6与ES7的一些特性,并用Babel构建,于是我稍作研究,给出最小的环境配置来使用Material-UI这套库。
初始化
创建一个项目目录并初始化项目(如果没有的话)
$ mkdir hello-material-ui
$ cd hello-material-ui
$ npm init
安装依赖
按照npm的提示初始化完毕这个目录后,开始安装依赖
$ npm install --save react react-dom react-tap-event-plugin material-ui
$ npm install --save-dev babel-core babel-loader
$ npm install --save-dev babel-preset-es2015 babel-preset-react babel-preset-stage-1
$ npm install --save-dev webpack
第一行是生产用的 React 与 Material-UI 部分。
第二行是Babel转换器的核心部分。
第三行是Babel转换器的三个额外配置:ES2015(ES6),React,Stage1(ES7)。
第四行是Webpack的部分。
第二、三、四行的内容只在工程构建之前有用(用于开发:-dev)。
安装完毕之后呢,可以先检查一下 package.json
npm init
之后,目录中就会有一个 package.json
如果安装顺利,里面应该有至少这样一些部分:
版本号不重要,各位配置的时候说不定已经出了新的版本。
如果确认跟随本文配置失败,那可以试试完全按照我的版本号来配置。
"dependencies": {
"material-ui": "^0.15.0","react": "^15.0.0","react-dom": "^15.0.0","react-tap-event-plugin": "^1.0.0" },"devDependencies": {
"babel-core": "^6.8.0","babel-loader": "^6.2.4","babel-preset-es2015": "^6.6.0","babel-preset-react": "^6.5.0","babel-preset-stage-1": "^6.5.0","webpack": "^1.13.0" }
配置 Babel
配置Babel的方案有两种,一种是在目录中新建一个.babelrc
的文件,然后按照JSON格式写入规则。
另一种,可以将.babelrc
与 package.json
合并(个人推荐):
在 package.json
中添加一个域"babel"
,与之前的"dependencies"
同级。
"babel": {
"presets": [ "es2015","react","stage-1" ],"plugins": [] }
这等同于在.babelrc
中写入:
{
"presets": [ "es2015","plugins": [] }
这样就将Babel配置好了,接下来考虑一下配置Webpack。
配置 Webpack
在项目目录新建一个webpack.config.js
,并写入:
var path = require('path');
module.exports = {
entry: './entry.js',output: {
path: path.join(__dirname,'/dist'),filename: 'bundle.js'
},resolve: {
extensions: ['','.js','.jsx']
},module: {
loaders: [
{ test: /\.jsx?$/,loaders: ['babel'] }
]
}
}
看上去很像一个JSON,但它其实不是,它是一个JS对象,你可以把webpack.config.js
当成一个模块。
比起JSON,用JS模块来作为配置更灵活。因为JS模块可以进行运算,甚至配置一些自定义函数。而JSON只能配置一些比较死的东西。
其实也大致能猜出一二的,整个项目的入口是./entry.js
——与webpack.config.js
同个目录下的一个JS文件。
具体各个域都有什么用,更多的配置,参见官方文档。
配置 npm 脚本
现在我们还缺少一个构建脚本,编辑package.json
中的 "scripts"
域:
"scripts": {
"build": "webpack","build-dev": "webpack -w -d" }
接下来我们就可以在项目目录下使用简单的构建脚本了:
$ npm run build
如果是开发中,可以使用监听式的Webpack,差量打包,提升效率。
$ npm run build-dev
按照配置,打包生成的文件为 dist/bundle.js
。
至此,基本的环境已经配置完毕,我们来尝试一下调用Material-UI库。
Hello,Material-UI!
接下来用一个简洁的方式构建一个Web页面。
创建Web入口
在项目目录下创建一个index.html
,写入:
<!doctype html>
<html>
<head>
<Meta charset="utf-8" />
</head>
<body>
<script src="dist/bundle.js"></script>
</body>
</html>
这是最基本的入口,仅设置了编码,并引用了JS。
编写Webpack入口
编辑项目目录下的 entry.js
,写入:
import React from 'react';
import ReactDOM from 'react-dom';
import getMuiTheme from 'material-ui/styles/getMuiTheme';
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import AppBar from 'material-ui/AppBar';
const App = () => (
<MuiThemeProvider muiTheme={getMuiTheme()}> <AppBar title="Hello,Material-UI!" /> </MuiThemeProvider> ); let app = document.createElement('div'); ReactDOM.render(<App />,app); document.body.appendChild(app);
然后运行构建脚本:
$ npm run build
输出了:
Hash: bc7d93c87854ed7f539e
Version: webpack 1.13.0
Time: 11389ms
Asset Size Chunks Chunk Names
bundle.js 1.12 MB 0 [emitted] main
+ 301 hidden modules
可以看到,这个Webpack构建一次还是相当花费时间的,bundle.js也不小。
对于Web应用来说,一开始就加载一个MB级别的资源不是一件好事。最好将bundle.js进一步压缩,并发布到CDN上加速。最好再写一个轻量的加载动画来提升用户体验。
现在可以看到目录下有了一个dist/bundle.js
。
运行
打开index.html
。
成功!如此我们就生成了一个HTML入口以及一个浏览器可以运行的前端JS文件。理论上来说可以配合任何的Web应用的后端进行开发。无论是使用PHP,Java Servlet、NodeJS(Express等)、Python、Ruby……都没有问题。
甚至可以部署到github.io上。