欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

create-react-app常用自定義配置教程示例

 更新時(shí)間:2022年06月24日 14:56:33   作者:更替客戶  
這篇文章主要為大家介紹了create-react-app常用自定義配置教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

Create React App 是一個(gè)官方支持的創(chuàng)建 React 單頁(yè)應(yīng)用程序的方法。它提供了一個(gè)零配置的現(xiàn)代構(gòu)建設(shè)置。
雖然開(kāi)箱即用,但是開(kāi)發(fā)中我們還是少不了做一些修改,下面總結(jié)了一些常用的配置。

yarn安裝依賴包報(bào)錯(cuò)

在項(xiàng)目目錄下運(yùn)行yarn,報(bào)錯(cuò)如下

yarn install v1.7.0
[1/4] Resolving packages...
[2/4] Fetching packages...
info There appears to be trouble with your network connection. Retrying...
error An unexpected error occurred: "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz: connect ETIMEDOUT 104.16.21.35:443".
info If you think this is a bug, please open a bug report with the information provided in "F:\\await\\react-rabc\\yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

提示很明顯,網(wǎng)絡(luò)連接超時(shí),我們更換一下源地址就行了

npm 設(shè)置為 淘寶源

npm config set registry https://registry.npm.taobao.org
npm config set disturl https://npm.taobao.org/dist

yarn 設(shè)置為 淘寶源

yarn config set registry https://registry.npm.taobao.org --global
yarn config set disturl https://npm.taobao.org/dist --global

項(xiàng)目中如果用的是 sass,需要下載 node-sass,這個(gè)依賴包下載是相當(dāng)?shù)穆?,可以單?dú)設(shè)置源地址

yarn config set sass-binary-site http://npm.taobao.org/mirrors/node-sass
npm config set sass-binary-site http://npm.taobao.org/mirrors/node-sass

最后刪除 node_modules,重新下載就行了

IE10下報(bào)錯(cuò), Map 未定義

yarn add react-app-polyfill

入口文件第一行引入

// This must be the first line in src/index.js
import 'react-app-polyfill/ie9'

react-app-polyfill

webpack添加 alias

config/modules.js文件中的webpackAliases的alias是解析項(xiàng)目根目錄下的tsconfig.json或者jsconfig.json來(lái)返回的,有點(diǎn)復(fù)雜

可以直接在webpack.config.js的resolve.alias字段中的末尾新增字段

resolve: {
  // ...
  alias: {
    // ...
    '@': path.resolve(__dirname, '../src')
  }
}

解決跨域,反向代理配置

1、安裝依賴

yarn add http-proxy-middleware

2、在src目錄下新建setupProxy.js文件

const { createProxyMiddleware } = require('http-proxy-middleware')
module.exports = function(app) {
  app.use(
    '/api',
    createProxyMiddleware({
      target: 'http://localhost:6000', // 請(qǐng)求接口地址
      changeOrigin: true,
      pathRewrite: {
        '^/api': '/'
      }
    })
  )
}

項(xiàng)目主要文件路徑配置

包括項(xiàng)目入口文件、靜態(tài)目錄、項(xiàng)目構(gòu)建輸出目錄、配置proxy文件...

在config/paths.js文件配置,挑出幾個(gè)最常用的

module.exports = {
  dotenv: resolveApp('.env'), // 項(xiàng)目環(huán)境變量文件
  appBuild: resolveApp('dist'), // 項(xiàng)目構(gòu)建輸出目錄,默認(rèn) build
  appPublic: resolveApp('public'), // 靜態(tài)目錄
  appHtml: resolveApp('public/index.html'), // index.html
  appIndexJs: resolveModule(resolveApp, 'src/index'), // 項(xiàng)目入口文件
  proxySetup: resolveApp('src/setupProxy.js') // 配置 proxy 文件
}

關(guān)閉自動(dòng)開(kāi)啟瀏覽器配置

在scripts/start.js文件,注釋掉openBrowser(urls.localUrlForBrowser)即可,
或者使用環(huán)境變量BROWSER

{
  "script": {
    "start": "cross-env BROWSER=none node scripts/start.js"
  }
}

修改 webpack output.publicPath

如果項(xiàng)目不是部署在靜態(tài)服務(wù)器根目錄下會(huì)用到,直接在package.json中配置homepage字段

{
  "homepage": "/e-admin/"
}

或者使用環(huán)境變量PUBLIC_URL

{
  "script": {
    "build": "cross-env PUBLIC_URL=/e-admin/ node scripts/build.js"
  }
}

生產(chǎn)環(huán)境關(guān)閉 sourcemap

一般在部署到生產(chǎn)環(huán)境會(huì)關(guān)閉 sourcemap,避免打包文件過(guò)大
查看 webpack.config.js 看到如下代碼:

const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== 'false';

可以在命令行中使用GENERATE_SOURCEMAP這個(gè)環(huán)境變量

{
  "script": {
    "build": "cross-env GENERATE_SOURCEMAP=false node scripts/build.js"
  }
}

eslint 配置

可以直接在package.json中的eslintConfig字段配置。

在根目錄下新建.eslint.js(或者.eslintrc)配置文件,然后在命令行中設(shè)置EXTEND_ESLINT

{
  "script": {
    "start": "cross-env EXTEND_ESLINT=true node scripts/start.js"
  }
}

因?yàn)楦髌脚_(tái)設(shè)置環(huán)境變量的方式不同,這里使用cross-env來(lái)抹平差異

裝飾器 Decorators 配置

開(kāi)發(fā)中會(huì)有很多高階組件以及 redux 的 connect 來(lái)包裹組件,使用 Decorators 寫(xiě)法會(huì)直觀許多

  • 先安裝 babel 插件
yarn add @babel/plugin-proposal-decorators
  • babel 配置,在 plugins 中添加
{
  "plugins": [
    [
      "@babel/plugin-proposal-decorators",
      {
        "legacy": true
      }
    ]
  ]
}

完成上面配置后,編譯就不會(huì)報(bào)錯(cuò)了,代碼能正常運(yùn)行,但是編輯器(這是使用VSCode)卻報(bào)錯(cuò)了,我們需要做額外的配置

在根目錄下新建 jsconfig.json 文件

{
  "compilerOptions": {
    "experimentalDecorators": true
  }
}

打開(kāi) VSCode 的 setting.json 文件,添加以下屬性

"javascript.implicitProjectConfig.experimentalDecorators": true

create-react-app 的 babel 配置默認(rèn)是在 package.json 中的,可以單獨(dú)放到根目錄下(.babelrc或者babel.config.js)

區(qū)分環(huán)境

開(kāi)發(fā)環(huán)境,測(cè)試環(huán)境,預(yù)生產(chǎn)環(huán)境,生產(chǎn)環(huán)境,很多配置項(xiàng)(比如接口地址)都是不同的,這時(shí)候我們需要根據(jù)環(huán)境來(lái)決定配置項(xiàng)。
create-react-app 默認(rèn)支持development,test,production,這里的 test 是用來(lái)做代碼測(cè)試的,并不是構(gòu)建測(cè)試環(huán)境的,我們需要多種打包環(huán)境。
這里我們先區(qū)分三個(gè)環(huán)境:

  • 開(kāi)發(fā)環(huán)境 dev
  • 測(cè)試環(huán)境 alpha
  • 生產(chǎn)環(huán)境 prod

1、然后在根目錄新建三個(gè)文件 .env,.env.alpha,.env.prod,文件內(nèi)容如下:

// .env
NODE_ENV=development
REACT_APP_MODE=dev
// .env.alpha
NODE_ENV=production
REACT_APP_MODE=alpha
// .env.prod
NODE_ENV=production
REACT_APP_MODE=prod

2、修改package.json的命令腳本

{
  "script": {
    "build:alpha": "cross-env MODE_ENV=alpha node scripts/build.js",
    "build:prod": "cross-env MODE_ENV=prod node scripts/build.js"
  }
}

3、修改config/env.js文件

// const NODE_ENV = process.env.NODE_ENV;
const NODE_ENV = process.env.MODE_ENV || process.env.NODE_ENV;

4、然后在業(yè)務(wù)代碼里面就可以使用process.env.REACT_APP_MODE來(lái)區(qū)分環(huán)境了

// axios.baseURL
const baseURL = {
  dev: 'http://localhost:3000',
  alpha: 'http://alpha.xxx.com',
  prod: 'http://xxx.com'
}[process.env.REACT_APP_MODE]

根據(jù)不同命令區(qū)分不同環(huán)境,這是通用的手段。
這里根據(jù)npm命令中的REACT_APP_MODE來(lái)決定使用哪個(gè).env.[xxx]的環(huán)境變量,注入到編譯代碼中。

注意:

  • 需要注意的是在 env.js 文件中將 NODE_ENV 替換為了 MODE_ENV,導(dǎo)致本來(lái)的 NODE_ENV 缺失,在 .env.[xxx] 文件中要補(bǔ)上
  • .env.[xxx] 的環(huán)境變量 以 REACT_APP_xxx 開(kāi)頭

編譯進(jìn)度條配置

安裝依賴

yarn add webpackbar

修改webpack.config.js文件

const WebpackBar = require('webpackbar')
plugins: [
  // ...
  new webpack.ProgressPlugin(),
  new WebpackBar()
]

webpack.ProgressPlugin() 是webpack內(nèi)置插件,webpack.ProgressPlugin,WebpackBar用來(lái)顯示編譯時(shí)長(zhǎng)

打包開(kāi)啟 gzip 壓縮

安裝依賴

yarn add compression-webpack-plugin

修改webpack.config.js文件

const CompressionPlugin = require('compression-webpack-plugin')
const isGzip = process.env.GENERATE_GZIP_FILE === 'true'
plugins: [
  // ...
  isEnvProduction && isGzip && new CompressionPlugin({
    filename: '[path].gz[query]', // 新版本 asset 屬性已更換為 filename
    algorithm: 'gzip',
    test: /\.js$|\.css$/,
    threshold: 10240,
    minRatio: 0.8
  })
]

通過(guò)設(shè)置環(huán)境變量GENERATE_GZIP_FILE=true來(lái)啟用gzip壓縮

請(qǐng)確保靜態(tài)服務(wù)器開(kāi)啟了 gzip 配置項(xiàng),nginx 配置 gzip_static on; 選項(xiàng)即可

下面是未開(kāi)啟gzip和開(kāi)啟gzip的效果:

未開(kāi)啟 gzip

開(kāi)啟 gzip

生成 report.html 可視化打包分析

安裝依賴

yarn add webpack-bundle-analyzer

修改webpack.config.js文件

const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')
const isBundleAnalyzer = process.env.GENERATE_BUNDLE_ANALYZER_REPORT === 'true'
plugins: [
  // ...
  isEnvProduction && isBundleAnalyzer && new BundleAnalyzerPlugin()
]

通過(guò)設(shè)置環(huán)境變量GENERATE_BUNDLE_ANALYZER_REPORT=true來(lái)生成report

引入 antd

antd 的 JS 代碼默認(rèn)支持基于 ES modules 的 tree shaking,即按需引入,只是樣式的引入有些區(qū)別

1、直接引入,樣式直接用編譯后的antd.css

import { Button } from 'antd'
import 'antd/dist/antd.css'
function App() {
  return (
    <Button type="primary">按鈕</Button>
  )
}

簡(jiǎn)單粗暴,但是沒(méi)法統(tǒng)一修改一些全局的顏色

2、引入 less

安裝依賴

yarn add less less-loader

wepack.config.js配置,默認(rèn)的rules已經(jīng)包含css和sass,先找到下面的正則

// style files regexes
const cssRegex = /\.css$/;
const cssModuleRegex = /\.module\.css$/;
const sassRegex = /\.(scss|sass)$/;
const sassModuleRegex = /\.module\.(scss|sass)$/;
// 加上匹配 less 文件的正則
const lessRegex = /\.less$/;
const lessModuleRegex = /\.module\.less$/;

然后加上 loader 配置,在sass-loader配置下面加上less-loader的配置

// Adds support for CSS Modules, but using SASS
// using the extension .module.scss or .module.sass
{
  test: sassModuleRegex,
  use: getStyleLoaders(
    {
      importLoaders: 3,
      sourceMap: isEnvProduction && shouldUseSourceMap,
      modules: {
        getLocalIdent: getCSSModuleLocalIdent,
      },
    },
    'sass-loader'
  ),
},
// 在下面加上 less-loader 配置
{
  test: lessRegex,
  exclude: lessModuleRegex,
  use: getStyleLoaders(
    {
      importLoaders: 2,
      sourceMap: isEnvProduction && shouldUseSourceMap,
    },
    'less-loader'
  ),
  sideEffects: true,
},
// Adds support for CSS Modules, but using less
// using the extension .module.less
{
  test: lessModuleRegex,
  use: getStyleLoaders(
    {
      importLoaders: 2,
      sourceMap: isEnvProduction && shouldUseSourceMap,
      modules: {
          getLocalIdent: getCSSModuleLocalIdent
      }
    },
    'less-loader'
  ),
},

找到getStyleLoaders方法,做如下修改:

// 將 if (preProcessor) {} 中的代碼替換,實(shí)際上就是判斷是`less-loader`就生成針對(duì)less的options
if (preProcessor) {
  let preProcessorRule = {
    loader: require.resolve(preProcessor),
    options: {
      sourceMap: true
    }
  }
  if (preProcessor === 'less-loader') {
    preProcessorRule = {
      loader: require.resolve(preProcessor),
      options: {
        sourceMap: true,
        lessOptions: { // 如果使用less-loader@5,需要移除 lessOptions 這一級(jí)
          javascriptEnabled: true,
          modifyVars: {
            'primary-color': '#346fff', // 全局主色
            'link-color': '#346fff' // 鏈接色
          }
        }
      }
    }
  }
  loaders.push(
    {
      loader: require.resolve('resolve-url-loader'),
      options: {
        sourceMap: isEnvProduction &amp;&amp; shouldUseSourceMap,
      },
    },
    preProcessorRule
  );
}

將import 'antd/dist/antd.css'換成import 'antd/dist/antd.less'

經(jīng)過(guò)上面的配置后,可以直接修改less變量來(lái)修改全局顏色、間距等,所有變量

當(dāng)然如果在配置文件中覆蓋less變量有些麻煩,可以直接直接新建單獨(dú)的less文件來(lái)覆蓋默認(rèn)變量

@import '~antd/lib/style/themes/default.less';
@import '~antd/dist/antd.less';
@import 'customer-theme-file.less'; // 用于覆蓋默認(rèn)變量

但是這種方式會(huì)加載所有組件的樣式,沒(méi)法做到按需加載

3、按需加載

安裝依賴

yarn add babel-plugin-import

babel 配置

"plugins": [
  [
    "babel-plugin-import",
    {
      "libraryName": "antd",
      "libraryDirectory": "es",
      "style": true
    }
  ]
]

去掉import 'antd/dist/antd.less'的引入,現(xiàn)在引入組件就會(huì)附帶引入對(duì)應(yīng)組件的樣式了

參考鏈接:

Create React App 官方文檔

Create React App 中文文檔

Ant Design

以上就是create-react-app常用自定義配置的詳細(xì)內(nèi)容,更多關(guān)于create-react-app自定義配置的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React 非父子組件傳參的實(shí)例代碼

    React 非父子組件傳參的實(shí)例代碼

    React 主要用于構(gòu)建UI,很多人認(rèn)為 React 是 MVC 中的 V(視圖)。本文給大家介紹React 非父子組件傳參的相關(guān)知識(shí),感興趣的朋友跟隨一起看看吧
    2021-04-04
  • React使用Echarts/Ant-design-charts的案例代碼

    React使用Echarts/Ant-design-charts的案例代碼

    這篇文章主要介紹了React使用Echarts/Ant-design-charts的實(shí)例代碼,本文通過(guò)實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-11-11
  • 詳解React中的todo-list

    詳解React中的todo-list

    這篇文章主要介紹了React中的todo-list的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-07-07
  • React報(bào)錯(cuò)Function?components?cannot?have?string?refs

    React報(bào)錯(cuò)Function?components?cannot?have?string?refs

    這篇文章主要為大家介紹了React報(bào)錯(cuò)Function?components?cannot?have?string?refs解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • React中引入less、less-loader問(wèn)題

    React中引入less、less-loader問(wèn)題

    這篇文章主要介紹了React中引入less、less-loader問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • react-redux的connect與React.forwardRef結(jié)合ref失效的解決

    react-redux的connect與React.forwardRef結(jié)合ref失效的解決

    這篇文章主要介紹了react-redux的connect與React.forwardRef結(jié)合ref失效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 利用ES6語(yǔ)法重構(gòu)React組件詳解

    利用ES6語(yǔ)法重構(gòu)React組件詳解

    這篇文章主要介紹了利用ES6語(yǔ)法重構(gòu)React組件的相關(guān)資料,文中通過(guò)示例代碼介紹的很詳細(xì),對(duì)大家具有一定的參考借鑒價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-03-03
  • redux的原理、工作流程及其應(yīng)用方式

    redux的原理、工作流程及其應(yīng)用方式

    這篇文章主要介紹了redux的原理、工作流程及其應(yīng)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • React報(bào)錯(cuò)解決之ref返回undefined或null

    React報(bào)錯(cuò)解決之ref返回undefined或null

    最近使用react做個(gè)滾動(dòng)監(jiān)聽(tīng)獲取更多數(shù)據(jù)效果,當(dāng)想獲取dom時(shí)發(fā)現(xiàn)怎么也獲取不到,下面這篇文章主要給大家介紹了關(guān)于React報(bào)錯(cuò)解決之ref返回undefined或null的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • React使用UI(Ant?Design)框架的詳細(xì)過(guò)程

    React使用UI(Ant?Design)框架的詳細(xì)過(guò)程

    Ant?Design主要用于中后臺(tái)系統(tǒng)的使用,它提供了豐富的組件和工具,可以幫助開(kāi)發(fā)人員快速構(gòu)建出美觀、易用的界面,同時(shí),Ant?Design還提供了詳細(xì)的文檔和示例,方便開(kāi)發(fā)者學(xué)習(xí)和使用,這篇文章主要介紹了React使用UI(Ant?Design)框架,需要的朋友可以參考下
    2023-12-12

最新評(píng)論