cra
const paths = require('react-scripts/config/paths');
paths.appBuild = path.join(path.dirname(paths.appBuild), 'dist'); // 修改打包目录
// Override `create-react-app` default configs for Jest.
const jestConfig = require('./jest.config'); module.exports = {
jest(config) {
return { ...config, ...jestConfig };
},
};
module.exports = function override(config, env) {
config.module.rules = config.module.rules.map(rule => {
if (rule.oneOf instanceof Array) {
return {
...rule,
oneOf: [
{
test: /\.(svg|png|jpg|jpeg|gif|bmp|tiff)$/i,
use: [
{
loader: 'file-loader',
options: {
name: '[path][name]-[hash:8].[ext]'
}
}
]
},
...rule.oneOf
]
};
}
return rule;
});
return config;
}
Putting react-app-rewired config AFTER customize-cra worked for me. It doesn't work though if I assign an object to config, but works if I fix config line by line. I'm sure there is a more elegant solution.
module.exports = function override(config, env) {
const APP = process.env.REACT_APP_APP
const BRAND = process.env.REACT_APP_BRAND
addWebpackAlias({
['@app-config']: path.resolve(__dirname, `./src/brands/${BRAND}/app`),
})
config.entry = `./src/${APP}/index.js`
config.resolve.alias['@app-config'] = path.resolve(__dirname, `./src/brands/${BRAND}`)
config.resolve.modules = [
path.join(__dirname, `src/brands/${BRAND}`)
].concat(config.resolve.modules)
return config
};
Can i replace options only for specific plugin without reseting all plugins created by react-app?
const path = require('path');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = function override(config, env) {
if( !config.plugins ) {
config.plugins = [];
}
const miniCssOptions = {
filename: "[name].[hash].css"
}
let miniCssAdded = false;
if( config.plugins.length ) {
config.plugins.forEach( p => {
if( p instanceof MiniCssExtractPlugin) {
delete p;
p = new MiniCssExtractPlugin( miniCssOptions );
miniCssAdded = true;
}
})
}
if( !miniCssAdded ) {
config.plugins.push( new MiniCssExtractPlugin( miniCssOptions ) );
}
config.plugins.push( new CleanWebpackPlugin() );
config.plugins.push( new HtmlWebpackPlugin({
title: 'Caching',
}) );
config.output.filename ='static/js/[name].[hash].js';
config.output.chunkFilename ='static/js/[name].[hash].js';
config.output.path = path.resolve(__dirname, 'build');
config.optimization.splitChunks= {
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all',
}
}
}
return config;
}
I think you almost made it. But delete p is NOT a way to delete item from an array. you should use .splice, which can delete items from array and add items in the meantime:
config.plugins.forEach( (p,i) => {
if( p instanceof MiniCssExtractPlugin) {
//delete p;
config.plugins.splice(i,1, new MiniCssExtractPlugin( miniCssOptions ));
}
})
const path = require('path');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = function override(config, env) {
if( !config.plugins ) {
config.plugins = [];
}
const miniCssOptions = {
filename: "[name].[hash].css"
}
let miniCssAdded = false;
if( config.plugins.length ) {
config.plugins.forEach( p => {
if( p instanceof MiniCssExtractPlugin) {
delete p;
p = new MiniCssExtractPlugin( miniCssOptions );
miniCssAdded = true;
}
})
}
if( !miniCssAdded ) {
config.plugins.push( new MiniCssExtractPlugin( miniCssOptions ) );
}
config.plugins.push( new CleanWebpackPlugin() );
config.plugins.push( new HtmlWebpackPlugin({
title: 'Caching',
}) );
config.output.filename ='static/js/[name].[hash].js';
config.output.chunkFilename ='static/js/[name].[hash].js';
config.output.path = path.resolve(__dirname, 'build');
config.optimization.splitChunks= {
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all',
}
}
}
return config;
}
"scripts": {
"format": "prettier --write",
"start": "PORT=3001 react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test"
},
https://stackoverflow.com/questions/58344625/react-application-production-build-static-folder-path-changes?r=SearchResults
You can use useBabelRc() function of customize-cra and in .babelrc, you can write babel config for antd.
{
"plugins": ["@babel/plugin-proposal-optional-chaining"]
}
https://medium.com/@adostes/enabling-optional-chaining-in-a-create-react-app-a9f626a515d9
var paths = require('react-scripts-ts/config/paths')
module.exports = function override(config) {
config.module.rules.push({
test: /\.(js|jsx)$/,
include: paths.appSrc,
loader: require.resolve('babel-loader'),
options: {
babelrc: false,
presets: [require.resolve('babel-preset-react-app')],
cacheDirectory: true,
},
});
config.module.rules.push({
test: /\.(ts|tsx)$/,
include: paths.appSrc,
loader: ['ts-loader'],
});
return config
}
Import typescript file inside javascript file
https://mikebridge.github.io/post/getting-started-typescript-react/
How do I change `src` folder to something else in create-react-app
const path = require('path');
module.exports = {
paths: function (paths, env) {
paths.appIndexJs = path.resolve(__dirname, 'mysrc/client.js');
paths.appSrc = path.resolve(__dirname, 'mysrc');
return paths;
},
}
https://stackoverflow.com/questions/44448851/how-do-i-change-src-folder-to-something-else-in-create-react-app/54625811?r=SearchResults#54625811
https://github.com/timarney/react-app-rewired#extended-configuration-options
module.exports = override(
config => ({
...config,
output: {
...config.output,
globalObject: 'this',
},
}),
addWebpackModuleRule({
test: /\.worker\.js$/,
use: { loader: 'worker-loader' },
}),
// addWebpackModuleRule({
// test: /\.wasm$/,
// use: { loader: 'wasm-loader' },
// }),
//https://github.com/YumcoderCom/yumgram/blob/master/config-overrides.js
module.exports = {
webpack (config, env) {
// Log current env
console.log('Current env', env)
// Inject global vars
config.plugins = (config.plugins || []).concat([new webpack.DefinePlugin({
...constants[env], ENV: `'${env}'`
})])
config = override(
// Inject lazy loading for ant design css
fixBabelImports('import', {
libraryName: 'antd',
libraryDirectory: 'es',
style: true,
}),
// And override styles
addLessLoader({
javascriptEnabled: true,
modifyVars: {
'@primary-color': '#3DBD7D',
'@link-color': '#5678a4',
'@success-color': '#3DBD7D',
'@warning-color': '#ffaa00',
'@error-color': '#E94A4C',
'@border-color-base': '#3DBD7D',
'@box-shadow-base' : 'none'
}
}),
// Inject translation
...addBabelPlugins('@lingui/babel-plugin-transform-js', '@lingui/babel-plugin-transform-react')
)(config, env)
// Return the webpack config
return config
}
}
const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
module.exports = function override(config, env) {
config.resolve.plugins = config.resolve.plugins.filter(plugin => !(plugin instanceof ModuleScopePlugin));
return config;
};
按照 npm 包页上的步骤操作(安装包并在包.json 文件中翻转调用),并使用与此类似的文件:config-overrides.js
这将从使用的 WebPack 插件中删除 ModuleScopePlugin,但保留其余内容,并消除弹出的必要性。
module.exports = config => {
const scopePluginIndex = config.resolve.plugins.findIndex(
({ constructor }) => constructor && constructor.name === "ModuleScopePlugin"
);
config.resolve.plugins.splice(scopePluginIndex, 1);
return config;
};
配置重写.js
const { removeModuleScopePlugin } = require('customize-cra')
module.exports = removeModuleScopePlugin()
配置重写.js
const ModuleScopePlugin = require("react-dev-utils/ModuleScopePlugin");
const path = require("path");
module.exports = function override(config) {
config.resolve.plugins.forEach(plugin => {
if (plugin instanceof ModuleScopePlugin) {
plugin.allowedFiles.add(path.resolve("./config.json"));
}
});
//https://stackoverflow.com/questions/44114436/the-create-react-app-imports-restriction-outside-of-src-directory/58863926?r=SearchResults#
return config;
};
//Customizing antd Less or Css for create-react-app
function addLessRule(config, env)
{
const { getLoader, loaderNameMatches } = require("react-app-rewired");
const fileLoader = getLoader(
config.module.rules,
rule => loaderNameMatches(rule, 'file-loader')
);
const lessExtension = /\.less$/;
fileLoader.exclude.push(lessExtension);
const cssRules = getLoader(
config.module.rules,
rule => String(rule.test) === String(/\.css$/)
);
var lessModifyVars = {
'primary-color': '#990000',
'link-color': '#1DA57A',
'border-radius-base': '2px',
'layout-header-background' : '#f0f2f5'
};
var lessLoaders = [
{ loader: 'style-loader'} ,
{ loader: 'css-loader' },
{ loader: 'less-loader', options: {
modifyVars: lessModifyVars
} }
];
lessRule = {
test : lessExtension,
use: lessLoaders,
}
config.module["rules"].push( lessRule );
return config
}
//https://stackoverflow.com/questions/44611056/customizing-antd-less-or-css-for-create-react-app/51109561?r=SearchResults#51109561
//django-webpack-loader not rendering react app using react-app-rewired
var BundleTracker = require('webpack-bundle-tracker');
module.exports = {
webpack: (config, env) => {
config.plugins.push(
new BundleTracker({
path: __dirname,
filename: './build/webpack-stats.json'
}),
);
return config;
},
};
//https://stackoverflow.com/questions/54241751/django-webpack-loader-not-rendering-react-app-using-react-app-rewired?r=SearchResults
//How do I debug a local typescript module used by an app created from create-react-app
/* config-overrides.js */
const rewireAliases = require("react-app-rewire-aliases");
const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
var path = require("path");
module.exports = function override(config, env) {
config.module.rules.push({
test: /\.ts$/,
use: ["awesome-typescript-loader"],
enforce: "pre"
});
config.resolve.plugins = config.resolve.plugins.filter(plugin => !(plugin instanceof ModuleScopePlugin));
config = rewireAliases.aliasesOptions({
"@common": path.resolve(
__dirname,
`node_modules/my-common-module/src/index.ts`
)
})(config, env);
return config;
};
//https://stackoverflow.com/questions/57605815/how-do-i-debug-a-local-typescript-module-used-by-an-app-created-from-create-reac/57649317?r=SearchResults#57649317
//Create-react-app + react-app-rewired + typescript + antd
const {
getLoader,
injectBabelPlugin
} = require("react-app-rewired");
const tsImportPluginFactory = require('ts-import-plugin')
module.exports = function override(config, env) {
// do stuff with the webpack config...
const tsLoader = getLoader(
config.module.rules,
rule =>
rule.loader &&
typeof rule.loader === 'string' &&
rule.loader.includes('ts-loader')
);
tsLoader.options = {
getCustomTransformers: () => ({
before: [
tsImportPluginFactory([{
libraryDirectory: 'es',
libraryName: 'antd',
style: 'css',
}]),
]
})
};
return config;
};
//https://stackoverflow.com/questions/49698564/create-react-app-react-app-rewired-typescript-antd/50022172?r=SearchResults#50022172
optimization: {
runtimeChunk: {
name: 'manifest'
},
splitChunks: {
maxInitialRequests: 10,
cacheGroups: {
vendor: {
test: /(jquery|fastclick|vue.esm.js)/,
name: 'vendor',
chunks: 'all'
},
common: {
test: /(\.(png|jpe?g|gif|svg))/,
name: 'app',
chunks: 'initial',
minChunks: 10
},
app: {
test: /(css[\\/]style.css)/,
name: 'app',
chunks: 'initial',
minChunks: 1
}
}
}
},
//你可以配置optimization,把你想要抽取的css,js,甚至是公用图片都抽取出来,例如:
//https://segmentfault.com/q/1010000017990233/
cra的更多相关文章
- 摄像头模组光学CRA(chief ray angle)
http://blog.csdn.net/sylorchen/article/details/54618874 Lens CRA CRA(Chief Ray Angle):从镜头的传感器一侧,可以聚焦 ...
- camera中LENS和SENSOR的CRA是如何搭配的?
camera中LENS和SENSOR的CRA是如何搭配的? camera中,lens和sensor的搭配是非常关键的问题.但这两者是如何搭配的呢? 一般在Sensor data sheet中会附有全视 ...
- react CRA antd 按需加载配置 lessloader
webpack配置 webpack.config.dev.js, webpack.config.prod同理. 'use strict'; const autoprefixer = require(' ...
- 使用CRA开发的基于React的UI组件发布到内网NPM上去
前言:构建的ES组件使用CNPM发布内网上过程 1. 使用Create-React-APP开的组件 如果直接上传到NPM,你引用的时候会报: You may need an appropriate l ...
- [React] Remove React PropTypes by using Flow Annotations (in CRA)
Starting from v15.5 if we wanted to use React's PropTypes we had to change our code to use a separat ...
- cacert.pem
## ## Bundle of CA Root Certificates ## ## Certificate data from Mozilla as of: Wed Sep 14 03:12:05 ...
- java web学习总结(七) -------------------HttpServletResponse对象(一)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...
- STM32F105解密STM32F105VB芯片解密STM32F105R8单片机破解多少钱?
STM32F105解密STM32F105VB芯片解密STM32F105R8单片机破解 STM32F105芯片Cortex-M3单片机解密: [凯基迪科技] STM32F105R8解密 | STM32F ...
- JMeter学习-038-JMeter Linux 环境配置
1.1.下载 Download URL:http://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-3.0.tg ...
随机推荐
- Git详解之Git起步
前言 本章介绍开始使用 Git 前的相关知识.我们会先了解一些版本控制工具的历史背景,然后试着让 Git 在你的系统上跑起来,直到最后配置好,可以正常开始开发工作.读完本章,你就会明白为什么 Git ...
- js的new操作符深度解析
引言 我们都知道new操作符在js中一般是用来创建一个构造函数的实例,它在创建实例具体做了什么,MDN文档是这么说的: 我一开始看到,完全没有任何的头绪和理解,到底什么意思,后面通过上网查阅了大量的资 ...
- 【原创】在 .NET Core 3.1 中使用 Senparc.Weixin.Work 企业微信 SDK —— 发送文本消息
下面在控制台应用里展示一个简单的例子来实现发送文本消息. 本文目录: 创建控制台应用 添加SDK引用 命令行方式 进入项目目录 添加包引用 配置和使用SDK 添加appsettings.json文件 ...
- 死磕java(4)
数组 public void int4() { int[] int2 = {1,2,3,4}; System.out.print(int2[2]); } 输出:3 另一种数组的初始化 public ...
- POJ_2342_树状dp
http://poj.org/problem?id=2342 第一道树状dp,入门题,用vector构建有向图. #include<iostream> #include<cstrin ...
- oracle查询表空间的空间占用情况
,) percent_used from (select tablespace_name,sum(bytes) bytes from dba_data_files group by tablespac ...
- 检测并移除WMI持久化后门
WMI型后门只能由具有管理员权限的用户运行.WMI后门通常使用powershell编写的,可以直接从新的WMI属性中读取和执行后门代码,给代码加密.通过这种方式攻击者会在系统中安装一个持久性的后门 ...
- 第2章 Java并行程序基础(二)
2.3 volatile 与 Java 内存模型(JMM) volatile对于保证操作的原子性是由非常大的帮助的(可见性).但是需要注意的是,volatile并不能代替锁,它也无法保证一些复合操作的 ...
- Go语言实现:常见排序算法
冒泡排序: 时间复杂度:O(n^2) 稳定性:稳定 //冒泡排序 //相邻两位交换,12交换,23交换,34交换,把最大的数放到最右边 //利用flag标记可以避免无效循环 func BubbleSo ...
- xdebug插件攻击
title: xdebug插件攻击 date: 2017-09-30 17:08:38 tags: 前一阵突然看到一个有关于xdebug的一个攻击面,不得不说这个想法还是很有意思的.自己搭环境记录一下 ...