create-react-app开发常用配置教程


Posted in Javascript onJune 25, 2022

引言

注: 如未找到配置文件请使用npm run eject弹出配置文件

当前对应版本react 16.2

设置代理

在开发中往往是跨域请求的,配置一下请求代理可以解决这个问题

// package.json 文件
"proxy": "http://xxx.xxx",

模块热替换(HMR)

默认情况下在每次修改内容的时候都会刷新页面,有时候我们并不想要这样,比如有一个bug需要重复点击或者重复操作多次才能实现,但是由于我们每次修改都会刷新页面,可能会导致这个bug很难被测试或者实现,这个配置在我看来非常有用,当然这不是必须的,但是可以适当的提高开发效率。在React 的入口文件 src/index.js中,添加一些配置代码。

// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import './index.css';
ReactDOM.render(
  <App />,
  document.getElementById('root')
);
//  +++++ 加入+++++
if (module.hot) {
  module.hot.accept();
}

css局部化

  • 正常导入css情况下会污染到全局
  • 修改 webpack-config-dev.js 及 webpack-config-prod.js 配置
options: {
  modules: true,
  localIdentName: '__[local]--[hash:base64:5]'
}

注意: 使用 css-module会导致 ant 样式失效...其次有其他css局部化解决方案 比如 styled-components可参考我另外一篇文章 骚里骚气的styled-components快速入门

支持装饰器写法

比如redux或者mobx可以使用@写法

安装 transform-decorators-legacy

npm install --save-dev babel-plugin-transform-decorators-legacy

插件中使用legacy是因为Babel 5支持处理装饰器,但是它也许会跟最终的标准有区别,所以才使用legacy这个词。

//  package.json
"babel": {
    "presets": [
      "react-app"
    ],
    "plugins": [
 // +++ 加入配置 +++
      "transform-decorators-legacy",
      // ...ant配置
    ]
  }

请注意, plugins 的属性非常重要: transform-decorators-legacy 应该放在最前面。 babel 设置有问题?请先查看这个 issue

打包后路径问题导致页面空白

//  package.json 文件增加配置
...
"homepage": ".",
...

注: 如果直接打开index.html后文件正确加载但页面仍然空白,请检查你是否使用的是 BrowserRouter (同vue的history模式)需要后端配置支持,否则请使用HashRouter 即带 #

配置简化路径

当页面嵌套过深时我们会发现在路径通常都要这么写

import xx from './../../../xxx/qqq'通过配置webpack可以写成import xx from '@/xxx/qqq'

// 修改 webpack.config.dev 与 webpack.config.prod 两个文件 加入相同配置
...
// +++ 找个开心的地方加入配置
function resolve(dir) {
    return path.join(__dirname, '..', dir)
}
// 修改
alias: {
      'react-native': 'react-native-web',
        // +++ 加入配置
      '@': resolve('src')
}
  • 优点: 如果按照相对路径的方法引用,每次要计算.. 并且文件一旦迁移 那么又要重新计算,如此配置文件迁移也不需要计算
  • 缺点: 在部分编辑器可能会失去文件引用高亮(比如webstrom), 并且不能通过快捷键快速查找其引用.

: 这属于webpack的配置,当然在vue-cli中也适用(更新:目前vue-cli已经默认支持这种配置)

按需引用antd-mobile(antd同)

  • 安装 antd-mobile npm i antd-mobile -S
  • 安装 babel-plugin-import npm i babel-plugin-import -D
// package.json 文件
  "babel": {
    "presets": [
      "react-app"
    ],
    // 加入配置
    "plugins": [
    // 如果使用了 定制颜色功能 将 "css" => true 同时需要配置 less
      ["import", { "libraryName": "antd-mobile", "style": "css" }]
    ]
  }

打包构建分析

build之后发现包体积比较大,用 webpack-bundle-analyzer 分析各个js文件的打包

// webpack.config.prod.js
const BundleAnalyzerPlugin = 
require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
// ...code
// 找到 plugins 记得别加错地方 很多 new xxx()的才是
plugins: [
    new xxx(),
    new xxx(),
    // +++++
    new BundleAnalyzerPlugin(),
]

生产环境去掉map文件

有时候你会发现build时间过长,参见npm run build takes 1-2 hours to build 我们可以去除掉map文件构建

// webpack.config.prod.js
- devtool: shouldUseSourceMap ? 'source-map' : false
// 改为
devtool: false,

配置less

安装

yarn add less-loader less --dev
//  webpack.config.dev.js
  module: {
    strictExportPresence: true,
    //...
    rules: [
        // ...
         {
            test: /\.(css|less)$/, // 修改
            use: [
              require.resolve('style-loader'),
              {
                loader: require.resolve('css-loader'),
                options: {
                  importLoaders: 1,
                },
              },
              {
                loader: require.resolve('postcss-loader'),
                options: {},
              },
              // 增加
              {
                loader: require.resolve('less-loader') // compiles Less to CSS
              }
            ],
          },
    ]
// webpack.config.prod.js
{
    test: /\.(css|less)$/, // 修改
                loader: ExtractTextPlugin.extract(
              Object.assign(
                {
                  fallback: {
                    loader: require.resolve('style-loader'),
                    options: {
                      hmr: false,
                    },
                  },
                  use: [
                  // ...code
                    {
                      loader: require.resolve('less-loader') // 增加
                    }
                  ],
                },
                extractTextPluginOptions
              )
            ),
}

配置不同环境变量

由于create-react-app 忽略了 env.NODE_ENV 环境变量的设置,参考文档 但是有时候在一些项目中,我们可能需要根据不同的环境变量使用不同的配置,那么我们可以这么做:

如果需要自定义环境变量 必须以REACT_APP_开头

// 修改package.json
  "scripts": {
    "start": "cross-env REACT_APP_SECRET_API=development node scripts/start.js",
    "build": "node scripts/build.js",
    "test": "node scripts/test.js --env=jsdom"
// 这三个是我加的 可以根据你的业务需求来
    "build:dev": "cross-env REACT_APP_SECRET_API=development node scripts/build.js",
    "build:test": "cross-env REACT_APP_SECRET_API=test node scripts/build.js",
    "build:pro": "cross-env REACT_APP_SECRET_API=production node scripts/build.js",
  },

然后我们在执行 npm run build:dev 的时候就可以拿到 REACT_APP_SECRET_API的值为development前面加 cross-env是为了兼容不同平台 需要自行安装 npm install cross-env --save-dev

以上就是create-react-app开发常用配置教程的详细内容,更多关于create-react-app开发配置的资料请关注三水点靠木其它相关文章!


Tags in this post...

Javascript 相关文章推荐
使用iframe window的scroll方法控制iframe页面滚动
Mar 05 Javascript
原生JavaScript实现合并多个数组示例
Sep 21 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
Oct 16 Javascript
Javascript的比较汇总
Jul 25 Javascript
JavaScript中windows.open()、windows.close()方法详解
Jul 28 Javascript
js遮罩效果制作弹出注册界面效果
Jan 25 Javascript
jquery横向纵向鼠标滚轮全屏切换
Feb 27 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
Mar 11 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
Aug 30 Javascript
在小程序中使用腾讯视频插件播放教程视频的方法
Jul 10 Javascript
浅谈JavaScript 代码简洁之道
Jan 09 Javascript
layui表格内容溢出的解决方法
Sep 06 Javascript
JavaScript架构搭建前端监控如何采集异常数据
Jun 25 #Javascript
webpack介绍使用配置教程详解webpack介绍和使用
Jun 25 #Javascript
JavaScript设计模式之原型模式详情
Jun 21 #Javascript
js前端设计模式优化50%表单校验代码示例
微前端qiankun改造日渐庞大的项目教程
Jun 21 #Javascript
JavaScript架构localStorage特殊场景下二次封装操作
Jun 21 #Javascript
js前端图片加载异常兜底方案
Jun 21 #Javascript
You might like
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
php GD绘制24小时柱状图
2008/06/28 PHP
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
2014/07/28 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
2016/06/13 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
2017/07/13 PHP
有效的捕获JavaScript焦点的方法小结
2009/10/08 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
处理及遍历XML文档DOM元素属性及方法整理
2013/08/23 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
WEB前端设计师常用工具集锦
2014/12/09 Javascript
jQuery实现个性翻牌效果导航菜单的方法
2015/03/09 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
全面解析Bootstrap中form、navbar的使用方法
2016/05/30 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
2016/10/10 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
JS监控关闭浏览器操作的实例详解
2017/09/12 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
原生js实现随机点餐效果
2019/12/10 Javascript
[15:46]教你分分钟做大人——沙王
2015/03/11 DOTA
Python的SQLalchemy模块连接与操作MySQL的基础示例
2016/07/11 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
django如何自己创建一个中间件
2019/07/24 Python
pycharm设置python文件模板信息过程图解
2020/03/10 Python
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
递归计算如下递归函数的值(斐波拉契)
2012/02/04 面试题
优秀员工自荐书
2013/12/19 职场文书
美容院经理岗位职责
2014/04/03 职场文书
优秀团干部个人事迹
2014/05/29 职场文书
民主生活会对照检查材料
2014/09/22 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
结婚喜宴祝酒词
2015/08/10 职场文书
技术入股合作协议书
2016/03/21 职场文书