概述
最近,我对零连续剧CSS-IN-JS库以及他们带来的性能好处感到好奇。一个相对较新的库是vanilla-extract
。因为我喜欢使用nx
构建项目,所以我很好奇是否已经支持它,但目前还没有。
这旨在在NX Workspace中的React/WebPack应用中展示一种快速简便的方法来添加对vanilla-extract
的支持。
什么是香草摘要?
vanilla-extract
是关于打字稿(或javaScript)中的零连接样式表。如果您过去使用过的SASS或更少,您已经知道它们对您的应用程序风格等主题,组织和预处理等事物的强大程度。
设置
让我们创建一个工作区
请参阅下面的命令,以创建NX工作区以及要遵循的选项。
注意:此时NX的当前版本是15.0.1
npx create-nx-workspace@latest
# Choose your style: Integrated
# What to create in the new workspace: react
# Repository name: vanilla
# Application name: example-web
# Default stylesheet format: CSS
# Enable distributed caching to make your CI faster: No
安装依赖项
npm i @vanilla-extract/css
npm i --save-dev @vanilla-extract/webpack-plugin
创建自定义WebPack配置
为了增加支持,我们需要做一些事情:
- 创建一个文件:
apps/example-web/webpack.config.js
5 - 添加香草 - 提取生成的CSS规则
- 在NX已提供的规则数组中预先将这些规则预先
- 替换规则数组
// file: apps/example-web/webpack.config.js
const { VanillaExtractPlugin } = require('@vanilla-extract/webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = (config) => {
const cssRule = config.module.rules.find((rule) =>
rule.test.toString().includes('css')
);
const rulesWithoutCss = config.module.rules.filter(
(rule) => !rule.test.toString().includes('css')
);
const rules = [
...rulesWithoutCss,
{
...cssRule,
oneOf: [
{
test: /\.vanilla\.css$/i, // Targets only CSS files generated by vanilla-extract
use: [
MiniCssExtractPlugin.loader,
{
loader: require.resolve('css-loader'),
options: {
url: false, // Required as image imports should be handled via JS/TS import statements
},
},
],
},
...cssRules.oneOf,
],
},
];
return {
...config,
plugins: [...config.plugins, new VanillaExtractPlugin()],
module: {
...config.module,
rules,
},
};
};
使用自定义WebPack配置
在文件apps/example-web/project.json
中,
找到属性webpackConfig
并将其替换为
"webpackConfig": "apps/example-web/webpack.config.js",
创建和使用您的样式
创建文件apps/example-web/src/app/app.css.ts
import { style } from '@vanilla-extract/css';
export const container = style({
padding: 10,
background: 'blue',
});
修改文件:apps/example-web/src/app/app.tsx
import { container } from './app.css';
import NxWelcome from './nx-welcome';
export function App() {
return (
<div className={container}>
<NxWelcome title="example-web" />
<div />
</div>
);
}
export default App;
运行应用程序
npm run start example-web
多数民众赞成!
- 您现在将看到页面的背景是蓝色的。不是最漂亮的事情,而只是为了证明它有效。
- 检查网络后,您可以找到具有生成样式的CSS文件
vendor.css
(此时和此示例)
您的下一步
- 尝试一下
- 进行自己的自定义,例如更改导出的CSS文件名,等等。
- 留下反馈;我很想看看如何改进。
请参阅示例存储库以获取完整的解决方案