美文网首页
react+webpack+react-router+redux

react+webpack+react-router+redux

作者: 殊一ONLY | 来源:发表于2017-12-28 21:57 被阅读0次

    在本搭建项目过程中有考虑到 React负责UI渲染,还需要用redux来管理数据,使用es6,webpack,为了提高性能,需要按需加载,还有immutable.js、单元测试等等。下面将会详细介绍

    搭建项目流程

    1 > mkdir dataProject && cd dataProject
    2 > npm init
    3 > npm install webpack --save-dev

    注: --save-dev 与 –save的区别
    --save-dev 开发时候依赖的东西,放在package.json的devDependencies模块,--save 发布之后还依赖的东西,放在dependencies模块。
    比如,你写 ES6 代码,如果你想编译成 ES5 发布那么 babel 就是devDependencies。
    如果你用了jQuery,由于发布之后还是依赖jQuery,所以是dependencies。但是在 npm 里面除了二进制的依赖,似乎也不用区分是不是dev。因为使用npm就是自己编译的意思,而不使用npm直接拿编译后的版本的,这些依赖项也看不到。

    4 webpack配置

    a. entry和output
    entry: webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。可根据它的属性定义设置单入口应用程序、分离应用程序、多页面程序。
    output: 配置 output 选项可以控制 webpack 如何向硬盘写入编译文件。filename 用于输出文件的文件名。目标输出目录 path 的绝对路径。

    const config = {
        entry: path.join(__dirname, 'src/index.js'),
        output:{
          path: path.join(__dirname, 'dist'),
          filename: 'app.js'
      }}
    

    学会使用webpack
    在package.json中的script属性设置命令:
    "build": "webpack --config webpack.config.js"
    运行 npm run build,会发现多了一个dist文件夹,其内部包含一个app.js文件
    dist文件夹下面新建一个app.html
    dist/app.html填写内容

    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
    <div id="app"></div>
    <script type="text/javascript" src="./app.js" charset="utf-8"></script>
    </body>
    </html>
    

    用浏览器打开app.html,会发现src内部的index.js内容被编译到了app.js。

    b. loader
    loader让webpack 能够去处理那些非JavaScript 文件,可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后你就可以利用 webpack 的打包能力,对它们进行处理。实质上是,将所有类型的文件,转换为应用程序依赖图可以直接引用的模块。
    比如npm install --save-dev css-loader,告诉webpack加载css文件。

    loader: [
        {
            test: /\.css$/,
            loader: 'style-loader!css-loader'
        },{
            test: /\.(png|jpg|gif|woff|woff2)$/,
            loader: 'url-loader?limit=8192'
        },{
            test: /\.(mp4|ogg|svg)$/,
            loader: 'file-loader'
        },{
            test:/\.json$/,
            loader:'json-loader'
          }
      ]
    

    loader 支持链式传递。能够对资源使用流水线(pipeline)。一组链式的 loader 将按照先后顺序进行编译。
    一个loader预期导出一个函数,而且是用兼容javascript的nodepgn
    c.(后续补充)

    d.plugin
    webpack 插件是一个具有 apply 属性的 JavaScript 对象。apply 属性会被 webpack compiler 调用,并且 compiler 对象可在整个编译生命周期访问

    const webpack = require('webpack'); //访问内置的插件
          const HtmlWebpackPlugin = require('html-webpack-plugin'); //通过 npm 安装
    let BowerWebpackPlugin = require('bower-webpack-plugin');
    plugins: [
            new webpack.optimize.UglifyJsPlugin(),
            new HtmlWebpackPlugin({template: './src/index.html'}),
    new BowerWebpackPlugin({
                searchResolveModulesDirectories: false
            })
         ]
    

    解析:
    HtmlWebpackPlugin:自动生成一个HTML文件,并引用相关的assets文件。
    webpack.optimize.UglifyJsPlugin():压缩插件,优化缩小js包体积。
    webpack.optimize.CommonsChunkPlugin():提取公共代码块。webpack的资源入口通常是以entry为单元进行编译提取,那么当多entry共存的时候,它可以对所有依赖的chunk以module为单位进行公共部分的提取。可以向其内部输入参数来设置提取所有入口的公共部分,也可以提取部分公共部分。可以实现:
    ①多入口,模块重复引用,分文件输出(将多次引用的模块打包到公共模块)
    ②将公共业务模块与类库或框架分开打包;
    (见https://segmentfault.com/a/1190000006808865
    延伸:如何解决webpack大包体积过大
    e.resolve
    设置模块如何被解析,其常用属性有:
    Alias:创建 import 或 require 的别名,来确保模块引入变得更简单
    extension:自动解析扩展,能够使用户在引入模块时不带扩展,默认有[‘.js’,’.json’]。
    plugins:应该使用的额外的解析插件列表
    e.devServer
    webpack-dev-server 能够用于快速开发应用程序,使用方法

    devServer: {
        contentBase: './src/',
        historyApiFallback: true,
        hot: true,
        port: defaultSettings.port,
        publicPath: defaultSettings.publicPath,
        noInfo: false
      }
    

    contentBase:告诉服务器从哪里提供内容。只有在你想要提供静态文件时才需要。
    historyApiFallback:当使用 HTML5 History API 时,任意的 404 响应都可能需要被替代为 index.html,则其值为true。通过传入一个对象,比如使用 rewrites 这个选项,此行为可进一步地控制。
    hot:启用 webpack 的模块热替换特性
    port:指定要监听请求的端口号
    publicPath:此路径下的打包文件可在浏览器中访问
    noInfo:当为true时,启用 noInfo 后,诸如「启动时和每次保存之后,那些显示的 webpack 包(bundle)信息」的消息将被隐藏。错误和警告仍然会显示。
    lazy:当启用 lazy 时,dev-server 只有在请求时才编译包(bundle)。这意味着 webpack 不会监视任何文件改动。我们称之为“惰性模式”。
    e.
    后续使用过程再补充

    5 babel

    Babel 把用最新标准编写的 JavaScript 代码向下编译成可以在今天随处可用的版本。 这一过程叫做“源码到源码”编译, 也被称为转换编译。
    npm install --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react babel-preset-stage-0
    a. babel文件配置
    新建babel配置文件.babelrc,内容为

    {
       "presets": [
         "es2015",
         "react",
         "stage-0"
       ],
       "plugins": []
     }
    

    b.详细介绍
    ①babel-core 转码
    如果你需要以编程的方式来使用 Babel,可以使用 babel-core 这个包。babel-core 的作用是把 js 代码分析成 ast ,方便各个插件分析语法进行相应的处理。有些新语法在低版本 js 中是不存在的,如箭头函数,rest 参数,函数默认值等,这种语言层面的不兼容只能通过将代码转为 ast,分析其语法后再转为低版本 js。
    首先安装 babel-core
    ②babel-loader
    允许用babel或webpack编译JavaScript文件。
    需要在webpack的配置文件中的添加babel-loader:

    {
          test: /\.js$/,
          exclude: /(node_modules|bower_components)/,
          use: {
            loader: 'babel-loader',
            options: {
              presets: ['@babel/preset-env']
            }
          }
    }
    

    ③ babel-preset-es2015 用于解析 ES6

    ④ babel-preset-react 用于解析 JSX

    ⑤ babel-preset-stage-0 用于解析 ES7 提案
    检测:将index.js文件使用箭头函数编写

    var fun = str => {
        document.getElementById('app').innerHTML = str;
    }
    fun('Babel设置成功')
    

    相关文章

      网友评论

          本文标题:react+webpack+react-router+redux

          本文链接:https://www.haomeiwen.com/subject/sllbgxtx.html