react+webpack+react-router+redux项目搭建(一)

在本搭建项目过程中有考虑到 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设置成功')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,125评论 7 35
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 webpack介绍和使用 一、webpack介绍 1、由来 ...
    it筱竹阅读 11,019评论 0 21
  • webpack 介绍 webpack 是什么 为什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert阅读 6,429评论 2 71
  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 5,266评论 4 31
  • 本系列导航:剑指offer(第二版)java实现导航帖 面试题8:二叉树的下一个节点 题目要求:给定二叉树和其中一...
    ryderchan阅读 1,879评论 2 0