react使用流程

# 安装node.js
安装node.js
安装前确保已经安装Homebrew,使用Homebrew安装Node.js这样就可以使用npm 命令 使用MAC终端
```
brew install node
```
# 安装webpack
```
$ npm install webpack --global //全局安装webpack
$ cd ~项目目录
$ npm init 
$ npm install webpack --save-dev
```
# 安装项目依赖
1.准备工作 安装项目依赖
```
$ npm install --save-dev babel-core babel-preset-es2015 babel-preset-react webpack-dev-server babel-loader react-hot-loader css-loader style-loader react react-dom [email protected]  
```
2.把package.json文件的devDependencies里的复制一份到dependencies里面

# 配置webpack
### 配置创建根目录webpack.config.js
##### 1.入口文件配置(entry)

Polyfilla把旧的浏览器想象成为一面有了裂缝的墙.这些[polyfills]会帮助我们把这面墙的裂缝抹平,还我们一个更好的光滑的墙壁(浏览器)内核版本太低不支持es6新语法。只要安装babel-polyfill插件,即可.
babel-polyfill用正确的姿势安装之后,引用方式有三种:

1.require("babel-polyfill");

2.import "babel-polyfill";

3.module.exports = {
  entry: ["babel-polyfill", "./app/js"]
};

注:第三种方法适用于使用webpack构建,加入到webpack配置文件(webpack.config.js)entry项中
重新执行构建命令,在低版本的浏览器中就可以正常打开页面了

react 这个库的核心代码就有 627 KB,这样和我们的源代码放在一起打包,体积肯定会很大。所以可以在 webpack 中设置

如果是一个数组,会将数组里面的文件一起打包到bundle.js
如果传入一个字符串,这个字符串就会被解析为启动时加载的模块。
如果传入个数组,所有模块都是启动时加载,模块导出到最后一个里面()。
如果传入一个对象,就会创建多个输入包文件(vendor.js和bundle.js),对象键值就chunk的name,值可以是字符串或者是数组。
```
{
  entry: {
        bundle: ["babel-polyfill", "./index.js"],/*入口文件路径*/
        vendor: ['react', 'react-dom', 'react-router']/*一起打包的库*/
  }
  plugins: {
    new webpack.optimize.CommonsChunkPlugin('vendor',  'vendor.js')
  }
}

```
这样打包之后就会多出一个 vendor.js 文件,之后在引入我们自己的代码之前,都要先引入这个文件。比如在 index.html 中
```
 <script src="/build/vendor.js"></script>
 <script src="/build/bundle.js"></script>
```
#####  2.入口文件输出配置(output)
1.path

绝对路径 (required).
[hash] 被编译后文件hash替换.

编译文件的输出路径: path.join(__dirname, 'dist')或者path.resolve(__dirname, "public/assets")

2.publicPath

生产环境下要加上 publicPath不然的话,webpack 在加载 chunk 的时候,路径会出错

publicPath指定了一个在浏览器中被引用的URL地址。 对于使用<script> 和 <link>加载器,当文件路径不同于他们的本地磁盘路径(由path指定)时候publicPath被用来作为href或者url指向该文件。这种做法在你需要将静态文件放在不同的域名或者CDN上面的时候是很有用的。 Webpack Dev Server 也是用这个方式来读取文件的。与path搭配使用上[hash]就可以做好缓存方案了。

2.filename

指定输出到硬盘的文件的的文件名。这里不能是一个绝对的路径!output.path会确定该文件的存在硬盘额路径的。filename仅仅用来给每个文件命名而已。
单一入口
```
{
  entry: './src/app.js',
  output: {
    filename: 'bundle.js',
    path: './built'
  }
}

// 写入磁盘: ./built/bundle.js
```
多入口

如果你的配置创建了多于一个的"chunk"(也就是带有多个入口点,或者使用了CommonsChunkPlugin这样的插件),你应该使用替换符来为每个文件命名一个为一个名字。

[name]被chunk的名字替换.

[hash]被编译器hash替换.

[chunkhash] 被chunk的hash替换.


```
{
  entry: {
    app: './src/app.js',
    search: './src/search.js'
  },
  output: {
    filename: '[name].js',
    path: __dirname + '/built'
  }
}

// 谢如磁盘: ./built/app.js, ./built/search.js
```

#####  3.加载器配置(module)
module 有loaders选项和noParse选项,noParse选项配置不需要解析的目录和文件


```
module: {
        loaders:[
            {
                test:/\.js$/,
                loader:'babel-loader',
                query: {
                    presets: ['es2015', 'react'],
                }
            },
            {test:/\.css$/,loader:'style-loader!css-loader'},
            {test: /\.(png|jpg)$/, loader: 'url-loader?limit=10000&name=./img/[hash].[ext]'}
        ]
    },
```

#####  4.其他配置(resolve)
配置默认扩展名 

1.需要有一个默认空字符串“”,否则在require 全名的时候反而会找不到 

2.默认值是[“”, “.webpack.js”, “.web.js”, “.js”]


```
resolve: {
        extensions: ['.', '.js', '.jsx']
    },
```


#####  5.压缩插件 (plugins)
webpack 自带了一个压缩插件UglifyJsPlugin,加入了这个插件之后,编译的速度会明显变慢,所以一般只在生产环境启用。
另外,服务器端还可以开启 gzip 压缩,优化的效果更明显只需要在配置文件中引入即可

```
{
  plugins: [
    new webpack.optimize.UglifyJsPlugin({
      compress: {
        warnings: false
      }
    })
  ]
}
```

```
 plugins:[
        // 定义生产环境,编译React 时压缩到最小
        new webpack.DefinePlugin({
            'process.env': {
                'NODE_ENV': JSON.stringify(process.env.NODE_ENV)
            }
        }),
        //分离css和js文件
        new ExtractTextPlugin('[name].css'),
        new webpack.optimize.CommonsChunkPlugin({
            name: ['vendor'],
            file: '[name].js'
        }),
        new webpack.optimize.UglifyJsPlugin({
            // 最紧凑的输出
            beautify: false,
            // 删除所有的注释
            comments: false,
            compress:{
                warnings:false,
                // 还可以兼容ie浏览器删除所有的 `console` 语句
                drop_console: true,
                // 内嵌定义了但是只用到一次的变量
                collapse_vars: true,
                // 提取出出现多次但是没有定义成变量去引用的静态值
                reduce_vars: true,
            },
            mangle:{
                except:['$super','$','exports','require']
            }
        })
    ]
```

```
/*
。
*/
var path = require('path');
var webpack = require('webpack');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports={
    // 入口文件配置(entry)
    entry: {
        bundle: ["babel-polyfill", "./index.js"],
        vendor: ['react', 'react-dom', 'react-router']
    },
    //入口文件输出配置(output)
    output:{
        path: path.resolve(__dirname, "dist/js"),  
        publicPath: '/dist/',
        filename: "[name].js"
    },
    //加载器配置(module)
   module: {
        loaders:[
            {
                test:/\.js$/,
                loader:'babel-loader',
                exclude: /node_modules/, //屏蔽不需要处理的文件(文件夹)(可选)
                query: {
                    presets: ['es2015', 'react'],
                }
            },
            {test:/\.css$/,loader:'style-loader!css-loader'},
            {test: /\.(png|jpg)$/, loader: 'url-loader?limit=10000&name=./img/[hash].[ext]'}
        ]
    },
    //其他配置(resolve)
    resolve:{
        extensions: ['.', '.js', '.jsx']
    },
    //压缩插件
    plugins:[
        // 定义生产环境,编译React 时压缩到最小
        new webpack.DefinePlugin({
            'process.env': {
                'NODE_ENV': JSON.stringify(process.env.NODE_ENV)
            }
        }),
        //分离css和js文件
        new ExtractTextPlugin('[name].css'),
        new webpack.optimize.CommonsChunkPlugin({
            name: ['vendor'],
            file: '[name].js'
        }),
        new webpack.optimize.UglifyJsPlugin({
            // 最紧凑的输出
            beautify: false,
            // 删除所有的注释
            comments: false,
            compress:{
                warnings:false,
                // 还可以兼容ie浏览器删除所有的 `console` 语句
                drop_console: true,
                // 内嵌定义了但是只用到一次的变量
                collapse_vars: true,
                // 提取出出现多次但是没有定义成变量去引用的静态值
                reduce_vars: true,
            },
            mangle:{
                except:['$super','$','exports','require']
            }
        })
    ]
};
```


2.安装 css loader 和style loader 
 
```
$ npm install css-loader style-loader --save-dev
```
3.在index.js 调用自己的css样式文件style.css代码require('style!css!./style.css')

4.在webpack.config.js文件里设置test:/\.css$/,loader:'style-loader!css-loader'

5 运行 webpack 打包, 运行 webpack-dev-server 启动服务器. 访问 http://localhost:8080/

6.安装npm install react react-dom --save 把React安装到项目里

7.创建bebal的配置文件.babelrc文件{
  "presets": ["es2015"]
}

//可不用1.设置bundle.js.map 使用source-map工具打包的项目方便调试

//可不用2.安装source-map终端:webpack --devtool source-map

Git 创建忽略文件
1.   cd 到文件 
2.   touch .gitignore
3.  vim .gitignore


猜你喜欢

转载自blog.csdn.net/zhjw1991/article/details/82689618