第14章 开发工具

React使用了若干的抽象层来帮助你更轻松地开发组件、推导程序状态。然而,在调试、构建及分发应用时,这样设计就会产生负面影响了。

幸运的是,我们拥有一些非常好的开发工具能在开发及构建过程中为我们提供帮助。在这里探讨这些构建工具和调试工具,它们可以让开发React程序更加高效。

Browserify

Browserify是一个JavaScript打包工具,支持浏览器中使用Node.js风格的require()方法。不需要了解太多的细节也不必不知所措,Browerify会自动将所有依赖打包到一个文件中,以支持模块在浏览器环境中使用。任何包含require语句的JavaScript文件运行Browerify都会自动打包所有的依赖项。

尽管十分强大,Browserify仅支持JavaScript文件,不像Bower、Webpack或者其他打包工具支持多种文件格式。

建立一个Browerify项目

想要让Broserify良好地运行起来,你必须初始化一个node项目,假设已经安装好了node和npm,你可以通过在终端运行下面命令来初始化一个新项目。这个命令会创建一个含有必要资源的package.json文件。

npm init
# ... answer questions as necessary to complete init
npm install --save-dev browserify reactify react uglify-js

在package.json文件的末尾增加如下构建脚本:

...
"devDependencies": {"browserify": "^5.11.2","reactify": "^0.14.0","react": "^0.11.1","uglify-js": "^2.4.15",
},
"scripts": {"build": "browserify --debug index.js > bundle.js","build-dist": "NODE_ENV=production browserify index.js | uglifyjs -m > bundle.min.js"
},
"browserify": {"transform": ["reactify"]
}

通过运行npm run build来执行默认的任务,这个命令会创建一个打包好的JavaScript文件和对应的源代码映射文件(source map)。这样的配置能够让你像引用多个独立文件那样查看错误信息和添加断点,而实际上你只引用了一个文件。同时,你也会看到原来的JSX代码而不是被编译成原生JavaScript的版本。

对于构建生产环境的代码,我们需要指明当前是生产环境。React使用了一个叫做enify的转换工具,当它和代码压缩工具如uglify一起使用时,可以移除所有调试代码和详细的错误信息。以此来提升效率并缩减文件体积。

如果你想要使用一些ES6的特性,如箭头函数或类,你可以把transform那一行改成这样:

"transform":[["reactify",{"harmony":true}]

现在你就可以写成React组件并将其打包了。

对代码做出修改

让我们创建一个名为index.js的React+JSX文件。

var React = require('react');
React.reder(<h1>Hello World</h1>, document.body);

再增加一个简单的index.html文件。

<html><head><title> React+Browserify Demo</title></head><body>This text shluld not appear in the browser<script src="bundle.js"></script></body>
</html>

现在项目结构看起来大致是这样的:

index.html
index.js
node_modules/
package.json

如果现在尝试打开index.html你会发现页面没有任何加载JavaScript,因为我们还没有打包出最终的文件。运行npm run build 命令然后再刷新该页面,这个示例程序就能成功加载了。

Watchify

你可以选择增加一个监控任务,它对开发工作大有帮助。Watchify是对Browserify的一个封装,当你改动了文件的时候,他会自动帮你重新打包。同时Watchify还是用了还缓存来加快重新打包的速度。

npm install --save-dev watchify

把下面这行添加到package.json中的scripts对象中。

"watch":"watchify --debug index.js -o bundle.js"

这样就不再需要运行npm run build ,运行npmrun watch即可,它会给你带来更流畅的开发体验。

构建

现在需要简单运行一下构建命令就能将React+JSX代码打包到一个文件中共浏览器使用了:

npm run-script build

你会看到多了一个新的bundle.js,打开bundle.js你会发现文件头部有一些被压缩过的JavaScirpt代码,后续跟着的是经过JSX转换的组件代码。这个文件包含了你在index.js中需要的所有的依赖,它可以在浏览器中运行,再打开index.html你会发现一切都正常工作了。

Webpack

Webpack和Browserify很像,也会把你的JavaScript代码打包到一个文件中。此外Webpack还能:

  • 将CSS、图片以及其他资源打包到同一个包中。
  • 在打包前对文件进行预处理(less、coffee、jsx等)。
  • 根据入口文件的不同把你的包拆分成多个包。
  • 支持开发环境的特性标志位。
  • 支持模块代码“热”替换。
  • 支持异步加载

因此Webpack能够实现Browserify混合其他构建工具如gulp、grunt的功能。

Webpack是一个模块功能系统,通过增加或者替换插件来实现功能,默认情况下,它启用了一个CommonJS解释器插件。

在这里我们不会详细介绍Webpack的每一种特性,不过我们会介绍基本的功能以及让它与React一起工作需要做的配置。

Webpack与React

React帮助你开发应用程序组件。Webpack不仅帮助你打包所有的JavaScript文件,还拥有其他所有应用需要的资源。这样的设计让你能创建一个自动包含所有类型依赖的组件。由于可以自动包含所有依赖,组件也变得更加方便移植。更妙的是,随着应用不断地开发并修改,当你移除某个组件的时候,它的所有依赖也会自动被移除。这意味着不会再有未被使用的CSS或图片遗留在代码目录中。

让我们看一下React组件使怎样加载资源依赖的。

// logo.js
require('./logo.css');var React = require('react');var Logo = React.createClass({render: function () {return <img className="Logo" src={require('./logo.png')} />}
})module.exports = Logo;

我们需要一个应用的入口文件来打包这个组件。

// app.js
var React = require('react');
var Logo = require('./logo.js');React.render(<Logo/>, document.body);

现在我们需要创建一个Webpack配置文件,以通知Webpack对不同的文件类型应该使用哪种加载器。同时,还要定义应用的入口文件以及打包后文件的存放位置。

// webpack.config.js
module.exports = {// 程序的入口文件entry: './app.js',output: {// 所有打包好的资源的存放位置path: './public/build',// 使用url-loader的资源前缀publicPath: './build/',// 生成的打包文件名filename: 'bundle.js',},module: {loaders: [{// 用于匹配加载器支持的文件格式的正则表达式test : /\.(js)$/,// 要使用的加载器类型// 加载器支持通过查询字符串的方式接收参数loader: 'jsx-loader?harmony'},{test: /\.(css)$/,// 多个加载器通过“!”链接loader: 'style-loader!css-loader'},{test : /\.(png|jpg)$/,// url-loader 支持 base64 编码的行内资源loader: 'url-loader?size=8192'}]}
};

现在,你需要安装Webpack及一系列加载器。你可以选择在控制台使用npm或修改package.json来完成安装。

确保你把这些加载器安装到了本地,而不是全局(使用-g参数)。

npm install webpack react
npm install url-loader jsx-loader style-loader css-loader

当所有的准备工作完成后,运行Webpack:

// 在开发环境构建一次
webpack// 构建并生成源代码映射文件
webpack -d// 在生产环境构建,压缩、混淆代码,并移除无用代码
webpack -p// 加速增量构建,可以和其他选项一起使用
webpack --watch

调试工具

安装React DeveloperTool扩展

第15章 测试

page125~180

React-引领未来的用户界面开发框架-读书笔记(七)相关推荐

  1. 读书笔记《React引领未来的用户界面开发框架》

    入门react,感觉这本书只是简单说了一些相关概念知识,并没有很详尽地展开论述,看了,做个总结笔记.

  2. React-引领未来的用户界面开发框架-读书笔记(五)

    第11章 性能优化 Reactde Dom diff算法使我们能够在任意时间点高效地重新绘制整个用户界面,并保证最小程度的DOM改变,然而,也存在需要对组件进行细致优化的情况,这时就需要渲染一个新的D ...

  3. React-引领未来的用户界面开发框架-读书笔记(二)

    第4章 数据流 由于react的数据流向是单向的(其父节点传递到子节点), 因此组件是简单且易于把握的(它们只需要从父节点获取props渲染即可) 假如顶层组件的某个prop改变了,react会递归地 ...

  4. React-引领未来的用户界面开发框架-读书笔记(一)

    这本书的主要内容都是以react v0.12为主,ES5语法,笔记中将会使用react v0.14和RS6. 第1章 react简介 1.本质上是一个状态机,它以精简的模型管理复杂的随着时间而变化的状 ...

  5. React-引领未来的用户界面开发框架-读书笔记(八)

    第16章 架构模式 React主要功能在于渲染HTML.可以将其看成是MVC中的V,它不会影响到组件中直接调用AJAX请求之类的操作: var TakeSurvey=React.CreateClass ...

  6. React-引领未来的用户界面开发框架-读书笔记(六)

    第12章 服务端渲染 想让搜索引擎抓取到你的站点,服务端渲染这一步不可或缺,服务端渲染还可以提升站点的性能,因为在加载JavaScript脚本的同时,浏览器就可以进行页面渲染. React的虚拟DOM ...

  7. React-引领未来的用户界面开发框架-读书笔记(四)

    第10章 动画 动画可以让用户体验变得更加流畅自然,而React的TransitionGroup插件配合CSS3可以让我们在项目中整合动画效果的变得易如反掌. 通常情况下,浏览器中的动画都拥有一套极其 ...

  8. React-引领未来的用户界面开发框架-读书笔记(三)

    第8章 DOM操作 多数情况下,React的虚拟DOM足以用来创建你想要的用户体验,而根本不需要直接操作底层真实的DOM.然而也有一些例外.最常见的场景包括:需要与一个没有使用React的第三方类库进 ...

  9. 读书笔记《React:引领未来的用户界面开发框架》

    <React:引领未来的用户界面开发框架>(GitHub 附demo版) 1.Component的创建与复合 1.1 React简介 背景介绍,全书概览 1.本质上是一个状态机,它以精简的 ...

最新文章

  1. Matlab R2016a 如何设置自己称心的工作区域
  2. Be a new gentleman
  3. golang 判断字符串是不是数字
  4. TD-SCDMA成为我国通信行业标准
  5. eclipse 国内镜像高速下载
  6. 二. 线程管理之线程池
  7. docker 主进程 日志_docker 命令 查看启动进程及日志
  8. 怎么在github上下载项目_Github上Top20 Python与机器学习开源项目汇总
  9. 使用WinIO库实现保护模式下的IO和内存读写(_inp,_outp)
  10. 创建一个MDK工程模板
  11. 比较sql server两个数据库
  12. JVM内存模型1.8
  13. JavaWeb项目结构
  14. CCF 2022:DPU评测技术白皮书发布【附白皮书下载】
  15. 单位工作制度牌展示_员工工号牌管理制度
  16. 原来 Elasticsearch 还可以这么理解
  17. Win11如何添加默认打印机?
  18. 做小红书推广快速涨粉的技巧_云媒易
  19. Android图片上传的两种方式
  20. 新手购买服务器搭建属于自己的网站(详细版)

热门文章

  1. ISA服务器之域内×××用户在外网通过CA验证连接域内×××服务器
  2. 10个人里有几个大学生?
  3. 浏览器缓存机制的研究分享
  4. 2020 .NET 开发者峰会顺利在苏州落幕,相关数据很喜人以及线上直播回看汇总
  5. .NET Core开发实战(第21课:中间件:掌控请求处理过程的关键)--学习笔记(上)...
  6. .NET开发者的机遇与Web Blazor基础(有彩蛋)
  7. 盘点618 .NET 程序员必“败”书单
  8. 一个实时收集MySql变更记录的组件CanalSharp.AspNetCore
  9. 为什么我的会话状态在ASP.NET Core中不工作了?
  10. 【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流