javascript - 使用不同的 CSS 和图像创建多个构建?
问题描述
我正在设计一个 React 应用程序,它需要有多个使用不同样式和图像的不同构建,例如header.png
不同部署的应用程序之间不同的图像。
我已经使用create-react-app
来初始化我的项目,并且我很想构建我的项目,以便我有一个common
用于常见 CSS/图像的目录,然后为每个构建提供一个自定义目录,类似于以下内容:
node_modules
public
\--index.html
src
|--resource
| |--common
| | |--img
| | \--styles
| |--build1
| | |--img
| | \--styles
| \--build2
| |--img
| \--styles
|--App.js
\--index.js
package.json
我将如何做到这一点:a)最终构建将只包含用于该构建的文件,b)我不必担心代码中任何地方的当前构建。
解决方案
有三件事要做。
导入路径
我假设您在 img 文件夹中的图像文件,例如 jpg、png、SVG 将被导入到组件中。
我将使用customize-cra和react-app- rewired 来覆盖 webpack 配置来配置不同的导入路径,这取决于不同的客户端。
首先您必须安装它们,然后您可以在项目根目录中创建一个名为的文件config-overrides.js
,并在 config-overrides 中为您的资源设置别名路径,例如 CSS、SVG 图标。
配置覆盖.js
const path = require('path');
const { addWebpackAlias, override } = require('customize-cra')
const resolveApp = relativePath => path.resolve(__dirname, relativePath)
module.exports.configOverrides = {
webpack: override(
addWebpackAlias({
'common': resolveApp('src/resource/common'),
'@': resolveApp(`src/resource/${process.env.CLIENT}`)
})
),
}
process.env.CLIENT
是你的客户端名,它会对应你的文件夹名如build1,build2, setup 后webpack alias
,你不用担心导入路径,你可以只使用一个代码。
在你的组件中,你可以这样写
import Layout from 'components/Layout';
import { ReactComponent as IconUser } from 'common/img/icon-user.svg';
import styles from '@/styles/header.css';
import { ReactComponent as Logo } from '@/img/logo.svg';
import HeaderImg from '@/img/header.jpg';
function App() {
return (
<Layout>
<div className={styles.header}>
<img src={HeaderImg>
<Logo />
<div>{user.name}</div>
</div>
</Layout>
)
}
如果你process.env.CLIENT
是build1
'@/img/logo.svg' 将引用resource/build1/img/logo.svg
,反之亦然
发展
您可以在您的设置不同的启动 cmdpackage.json
以启动不同的客户端process.env.CLIENT
{
"scripts": {
"start:build1": "process.env.CLIENT=build1 npm run start",
"start:build2": "process.env.CLIENT=build2 npm run start",
}
}
生产建设
在构建过程完成后,编写一个命令,将构建文件夹内容复制到每个客户端的文件夹中,这样不同客户端构建的代码不会相互覆盖。
{
"scripts": {
"build:build1": "process.env.CLIENT=build1 npm run build && mv build build1",
"build:build2": "process.env.CLIENT=build2 npm run build && mv build build2",
}
}
我不确定这是否是您想要的,如果您有任何问题,请告诉我,谢谢!
推荐阅读
- data-structures - 如何在快速联合操作中选择元素?
- reactjs - 在 react-native 中运行应用程序时出错
- dart - Dart 语言返回 void 方法
- c++ - 为什么程序不能正确计算值?
- sas - 删除 A || 的重复项 B 等于 B || 一个
- mysql - 尝试创建关系时出错:外键约束的格式不正确 - MariaDB
- r - 在闪亮的应用程序中将 plotlyOutput() 移动到服务器端
- amazon-web-services - Docker Push 添加标签而不是图像
- c# - 检查 CellPainting 行索引是否高于 0
- c++ - 如何在 Visual Studio 或 CLion 调试器中单步执行 ispc 源文件?