好的部署需要做到两点:
1. 性能优化: 包括代码执行速度, 页面载入速度
2. 自动化: 减少重复工作

使用 React+Redux 的时候往往会用到其调试工具 Redux DevTools, 在手动配置 DevTools 时需要针对 Store 和 Component 进行一些配置, 然而这些都是为了方便调试的, 生产环境下我们不希望加入这些东西, 所以建议从代码上隔离 development 和 production 环境:

containers/
  Root.js
  Root.dev.js
  Root.prod.js
  ...

store/
  index.js
  store.dev.js
  store.prod.js
`</pre>

同时采用单独的入口文件, 比如上面的 containers/Root.js, 按需要加载不同环境的代码

<pre>`if (process.env.NODE_ENV === 'production'){
  module.exports = require('./Root.prod');
} else {
  module.exports = require('./Root.dev');
}
`</pre>

有一个细节需要注意: ES6 语法不支持在 if 中书写 import 语句, 所以这里采用了 CommonJS 的模块引入方法 require.

另一个需要注意的地方是按需要 import, 否则可能在打包的时候引入不必要的代码

使用 webpack 进行打包工作

<pre>`webpack --config webpack.config.prod.js --progress
`</pre>

注意要为不同的环境准备不同的 webpack 配置文件. 比如 `webpack.config.dev.js` 和 `webpack.config.prod.js` . 看一下比较关键的配置选项

### devtools

启用 source-map, 这样 webpack 会生成两个包
- bundle.js
- bundle.js.map
把用于定位源码的 source map 分离出去, 减少 bundle.js 的体积

source-map 只会在浏览器 devtools 激活时加载, 并不会影响正常页面的饿加载速度.

### plugins

<pre>`plugins:[
  new webpack.optimize.UglifyJsPlugin({
    compress:{
      warning: false
    }
  }),
  new webpack.optimize.DedupePlugin(),
  new webpack.optimize.OccurenceOrderPlugin()
]
`</pre>

### 不要忽视 NODE_ENV

NODE_ENV 其实就是一个环境变量, 在 Node 中 可以通过`process.env.NODE_ENV`获取, 目前大家汪汪用这个变量区分当前是 development 还是 production.

通过 webpack 的 DefinePlugin 设置环境变量:

<pre>`plugins:[
  ...
  new webpack.DefinePlugin({
    'process.env.NODE_ENV': JSON.stingify('production')
  })
]

### 添加 hash
前端公认的 Best Practice 就是给资源打上 hash 标签, 这对缓存静态资源很有用

1\. 给 bundle.js 添加 hash 标签
`</pre>

output{
  path: ...
  filename: 'bundle.[hash].js'
}

<pre>`使用 html-webpack-plugin 这个插件自动生成带有
`</pre>

&lt;script src='bundle.[hash].js>&lt;/script>'的 html 文件

<pre>`配置如下:
`</pre>

plugins:[
  ...
  new HtmlWebpackPlugin({
    title:'html title',
    template:'./template.html',
    favicon: './static/images/logo.ico'
  })
]

<pre>`配置 template.html
`</pre>

<!DOCTYPE html>
&lt;html>
&lt;head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
&lt;/head>
&lt;body>

<div id="react-container"></div>

&lt;/body>
&lt;/html>

<pre>`
如果需要在 React Component 中添加图片, 建议采用
`</pre>

import LOGO.png from './static/images/logo.png'
&lt;img src={LOGO.png} alt="" />

<pre>`使用 import 或 require 可以让 webpack 对图片进行打包

使用 file-loader 可以对图片添加 hash 标签然后返回相应的 URL

module:{
loaders:[
{
test: /.(png|jpg),
loader:”file?name=[hash].[ext]”
}
]
}

1
2
3
4
5
6

### 引入 CSS

可以直接在 js 文件中 `require('./foo.css')`, 然后使用 style-loader 和 css-loader 进行处理, 最终效果是将 css 嵌入到 HTML 的 style 标签中, 这样就不需要使用 hash

CSS 较大的话, 可以考虑使用 extract-text-webpack-plugin 插件将 CSS 合并后独立为一个文件, 并自定在页面加载的时候添加 link 标签