react以create-react-app为基础创建项目


Posted in Javascript onMarch 14, 2018

什么是create-react-app

create-react-app是一个js库,使用它能够很方便地建立react项目,免去了建立react项目时配置webpack、调试服务器、运行脚本等麻烦,你只需要使用这个库,便可以一键完成react项目的创建初始化项目

首先,要先利用create-react-app创建一个react项目,可参考https://github.com/facebookincubator/create-react-app

注:用“[ ]”包裹的都是可自定义的内容,例如:cd [project-name],实际上可能是cd my-app,也可能是cd my-project。总之“[ ]”包裹的内容,只表示上下文里相互对应的变量。

npm install -g create-react-app 
 
create-react-app [project-name] 
cd [project-name]

运行完以上命令就已经处在新建的项目中了,此时运行npm run start和npm run build了。但是,默认所有配置是隐藏起来的,要想自定义配置,需要运行一个命令:

npm run eject

此时会提示,该命令不可逆,是否继续,输入y,这样所有配置项就都出来了。这时候也可以做一些定制化的配置了,比如:

修改build后的output位置

js / css / img等静态资源会默认输出到 build -> static 下面,其配置项在config -> webpack.config.prod.js 里。

  1. js在output属性里,大约第60行 ;
  2. css在开头的cssFilename变量声明,大约第38行;
  3. 图片等在module -> rules的loader配置里,大约第143行;

map文件由devtool属性控制,如果不想要map,注释掉就可以,大约第57行;

manifest.json在ManifestPlugin的配置里,大约294行;

基础模板在HtmlWebpackPlugin的配置里,不过可以看到,是引的  ‘./paths.js' 文件,所以要修改 config -> paths.js 里面的 appHtml 属性;

默认在build时会清空build目录,配置项是scripts -> build.js 里的 fs.emptyDirSync(paths.appBuild); 这一句,注释掉就不会把老文件删掉了(灰度发布的时候可能会用到);

不eject其他修改配置的方法

除了 npm run eject 暴露出所有配置文件外,还有其他办法修改配置,由于本文主题原因不做展开,仅给出相关链。

一个(部分人认为)比较优雅的方法,即引入 react-app-rewired 插件来实现配置覆盖。需要在根目录新建一个 config-overrides.js 文件,想配置啥就写啥(怎么又多出来一种配置。。。),还需要重写下npm start等相关命令,详情点击链接查看。

另一个可参考create-react-app的git主页上推荐的Adding a CSS Preprocessor (Sass, Less etc.) 例子。大概思路就是先安装一个node环境可编译sass的插件node-sass-chokidar,然后利用npm-run-all同时运行npm start 和 watch-css(监听sass文件的命令)。个人感觉绕了个大圈,还是再议吧。。。

react等作为全局变量不打包

为了利用cdn,我们常会在页面里引用react或其他类似库的script标签,这样在浏览器环境里就有了相应的全局变量,同时减少了js的体积。下面以react为例。

首先在config -> webpack.config.prod.js 的配置里加入如下代码:

module.exports = { 
 ... 
 externals: { 
 'react': 'React', 
 'react-dom': 'ReactDOM' 
 }, 
 ... 
}

key对应的是库的名字,value对应的是全局变量的名字。这里要注意,全局变量的名字要与代码中import的名字一致,要保证规范。

另外,此处要修改下 html-webpack-plugin 插件配置的模板文件,因为需要加入全局变量,所以加入相应的script即可。以 public -> index.html 为例:

<!DOCTYPE html> 
<html lang="en"> 
 <head> 
 <meta charset="utf-8"> 
 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 
 <meta name="theme-color" content="#000000"> 
 <!-- 
  code here 
 --> 
 </head> 
 <body> 
 <noscript> 
  You need to enable JavaScript to run this app. 
 </noscript> 
 <div id="root"></div> 
 <!-- 
  code here 
 --> 
<!-- 新插入的两个js --> 
 <script src="http://st01.chrstatic.com/themes/chr-cdn/react/v0.14.8/react.min.js"></script> 
 <script src="http://st01.chrstatic.com/themes/chr-cdn/react/v0.14.8/react-dom.min.js"></script> 
 </body> 
</html>

问:既然浏览器里面都有了全局变量,如window.React,那么代码里面其实就不用 import React from 'react' 了,更进一步,如果连react都不用引了,那么设置externals又有什么用呢(这个地方好好缕缕,是不是这个理)?

答:如果按照上面所说,去掉import和external,build出来的文件是可以顺利的在浏览器端运行的。但是如果开发的时候是起的server,那么server端就没法分析引用了,也就没法做到热更新了,另外,对于前后端同构来说,服务端也是找不到依赖的。所以,如果你是开着静态文件的监听,并且手动刷新浏览器的话,不import和external理论上是没问题的。

安装sass或less(以sass为例)

npm install sass-loader node-sass --save-dev

或 

npm install less-loader less --save-dev

安装后修改config -> webpack.config.dev.js 和 webpack.config.prod.js,分别在css的loader配置里面修改两处:
一是 test: /\.css$/ 增加scss和sass;二是use里面最后再加个loader,直接加 "sass-loader" 就可以了,也不用配置别的了(less同)。

//test: /\.css$/ 
test: /\.(css|scss|sass)$/ 
... 
use:[ 
 { 
 ... 
 }, 
 "sass-loader" 
]

添加ant-design

安装antd及按需加载的插件babel-plugin-import,参考https://ant.design/docs/react/introduce-cn

npm install antd babel-plugin-import --save-dev

在config -> webpack.config.dev.js 和 webpack.config.prod.js 里(或者 .babelrc 文件)的babel-loader的options配置里,加入如下代码:

plugins: [ 
 ['import', { libraryName: 'antd', style: 'css' }] // `style: true` 会加载 less 文件 
]

如果启用了 style:true 那就必须是装less了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery实现鼠标可拖动调整表格列宽度
May 26 Javascript
基于jQuery实现搜索关键字自动匹配功能
Mar 26 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
Jan 04 Javascript
全面详细的jQuery常见开发技巧手册
Feb 21 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
Jun 29 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
Dec 20 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
May 02 Javascript
Vue2.0实现组件数据的双向绑定问题
Mar 06 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
Jun 10 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
Nov 15 Javascript
H5 js点击按钮复制文本到粘贴板
Nov 19 Javascript
详细介绍Next.js脚手架完整搭建封装
Apr 26 Javascript
200行代码实现blockchain 区块链实例详解
Mar 14 #Javascript
vue使用iframe嵌入网页的示例代码
Jun 09 #Javascript
JavaScript实现区块链
Mar 14 #Javascript
iview table render集成switch开关的实例
Mar 14 #Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
Mar 14 #Javascript
Vue.js 动态为img的src赋值方法
Mar 14 #Javascript
基于datepicker定义自己的angular时间组件的示例
Mar 14 #Javascript
You might like
用C/C++扩展你的PHP 为你的php增加功能
2012/09/06 PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
2015/12/22 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
2017/02/17 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
jQuery对表单的操作代码集合
2011/04/06 Javascript
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
jquery统计复选框选中示例
2013/11/05 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
jQuery模仿单选按钮选中效果
2016/06/24 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
Angularjs单选改为多选的开发过程及问题解析
2017/02/17 Javascript
vue2.0 循环遍历加载不同图片的方法
2018/03/06 Javascript
vue cli 3.0 使用全过程解析
2018/06/14 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
javascriptvoid(0)含义以及与&quot;#&quot;的区别讲解
2019/01/19 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
2019/04/16 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
Python中replace方法实例分析
2014/08/20 Python
Python计算三角函数之asin()方法的使用
2015/05/15 Python
Django中模版的子目录与include标签的使用方法
2015/07/16 Python
Python使用logging结合decorator模式实现优化日志输出的方法
2016/04/16 Python
Python基于回溯法子集树模板实现图的遍历功能示例
2017/09/05 Python
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
一行Python代码制作动态二维码的实现
2019/09/09 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
python else语句在循环中的运用详解
2020/07/06 Python
Python脚本调试工具安装过程
2021/01/11 Python
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
门面房租房协议书
2014/08/20 职场文书
企业挂职心得体会
2014/09/10 职场文书
生死抉择观后感
2015/06/09 职场文书
2019年家电促销广告语集锦
2019/10/21 职场文书
总结几个非常实用的Python库
2021/06/26 Python
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python