使用customize-cra
进行辅助配置
customize-cra
功能库是react-app-rewired
功能库最好的搭档,一般在安装react-app-rewired
时会连同customize-cra
一起安装。
npm install react-app-rewird customize-cra --save-dev
yarn add react-app-wired customize-cra --dev
customize-cra
的主要目标是帮助react-app-rewired
更改其config-overrides.js
配置文件。当使用customize-cra
之后,config-overrides.js
中导出的内容将不再是一个函数,而是导出函数override()
的调用结果。这里给出一个示例配置。
const { override, disableEsLint, addBundleVisualizer } = require('customize-cra');
module.exports = override(disableEsLint(), process.env.BUNDLE_VISUALIZE == 1 && addBundleVisualizer());
函数overrides()
接受若干表达式作为参数,其中所使用的参数一般都由customize-cra
提供。常用的主要有以下这些。
addTslineLoader(loaderOptions)
,添加TSLint支持,需要安装tslint-loader
。addExternalBabelPlugin(plugins)
,添加目录node_modules
之外的 Babel 插件。addBabelPlugin(plugins)
,添加项目中已经安装的Babel插件。addBabelPresets(...presets)
,添加项目中已经安装的Babel Preset。babelInclude(includes)
,重写babel-loader
的include
选项。babelExclude(excludes)
,重写babel-loader
的exclude
选项。fixBabelImports(libraryName, options)
,添加babel-plugin-import
插件支持,并配置指定库。addDecoratorsLegacy()
,使用传统模式支持修饰器,需要安装@babel/plugin-proposal-decorators
。disableEsLint()
,关闭ESLint支持。useEslintRc(configFile)
,指定要使用的.eslintrc
文件。enableEslintTypescrit()
,允许eslint-loader
检查Typescript文件。addWebpackAlias(alias)
,向Webpack配置的别名区域增加别名设置。addWebpackResolve(resolve)
,向Webpack的依赖提供区域增加依赖解析。addWebpackPlugin(plugin)
,向Webpack增加插件。addWebpackExternals(deps)
,增加额外的依赖,通常用来使用CDN功能。addWebpackModuleRule(rule)
,向Webpack的module.rules
部分增加规则设置。addWebpackTarget(target)
,向Webpack增加编译目标。addBundleVisualizer(options, behindFlag=false)
,增加Bundle Visualizer插件支持,需要安装webpack-bundle-analyzer
。useBabelRc()
,指定使用.babelrc
或者.babelrc.js
文件来控制Babel配置。adjustWorkbox(fn)
,调整Wrokbox配置。addLessLoader(loaderOptions)
,增加Less支持,需要安装less
和less-loader
。addPostcssPlugins([plugins])
,增加Post-CSS插件。disbaleChunk()
,关闭编译文件分段功能。removeModuleScopePlugin()
,移除用于防止从src
目录之外应用模块的CRA插件。在源码目录不是src是使用。watchAll()
,指示CRA监控所有项目文件,包括node_modules
中的文件。与参数--watch-all
功能相同。
除了可以调整Wepack的设置以外,customize-cra
还可以调整Webpack DevServer的设置,这需要引入overrideDevServer
。以下给出一个同时覆盖Webpack和Webpack DevServer的配置。
const { override, disableEsLint, overrideDevServer, watchAll } = require('customize-cra');
module.exports = {
webpack: override(disableEsLint()),
devServer: overrideDevServer(watchAll())
};
从以上示例可以看出,若要覆盖Webpack的配置,需要在覆盖配置文件中导出以webpack
为键名的覆盖配置;要覆盖Webpack DevServer的配置,则需要导出以devServer
为键名的覆盖配置,这与react-app-rewired
中的配置方法是一致的。
如果需要使用customize-cra
以外的配置功能,可以自定义配置函数。配置函数需要返回一个接受目前config
作为参数,并返回完成配置之后的config
的函数。以下以addWebpackAlias()
的源码为例来展示自定义配置函数的写法。
export const addWebpackAlias = alias => config => {
if (!config.resolve) {
config.resolve = {};
}
if (!config.resolve.alias) {
config.resolve.alias = {};
}
Object.assign(config.resolve.alias, alias);
return config;
};