Web*_*urk 5 javascript sass node.js next.js next.js13
我正在使用 NextJS v.13 构建一个前端应用程序,这将是一个可供多个站点使用的通用前端代码库。
我希望有:
当我为site1构建代码库时,我想以某种方式告诉应用程序在构建时使用button.site1.css。
基本上我想实现以下目标:
.env.local
HOST_NAME=site1
Run Code Online (Sandbox Code Playgroud)
关于.js
import styles from `./Button.${process.env.HOST_NAME}.scss`; // This doesn't work. "Imports must be string literals"
const About = () => {
<div>
<h1 className={styles.h1}">About Page</h1>
</div>
)
}
Run Code Online (Sandbox Code Playgroud)
尽管 @Felix Ekl\xc3\xb6f 推荐了一种非常好的方法,即以编程方式重命名文件。这里有一些更简单、更合适、更方便的东西。
\n只需将两种样式导入组件中,然后根据.env文件中的变量使用所需的样式即可。Next.js 会自动对未使用的额外类进行 tree-shake,因此您不必担心生产中的性能或使生产具有大量 CSS。
import styles1 from "your-styles1.module.scss";\nimport styles2 from "your-styles2.module.scss";\n\nconst styles = process.env.HOSTNAME === "host1" ? styles1 : styles2;\nRun Code Online (Sandbox Code Playgroud)\n非常简单并且更容易实施。正确的?
\n如果您正在寻找有条件地添加全局样式。请改用linkinside next/head。\n首先,将样式放入public目录中。然后,用你的_app.jsx
// do not import global styles that are scopped to specific HOST, \n\nexport default function(...) {\n const styleSheetLink = getStyleSheetLink(process.env.HOSTNAME) // some logic to detect appropreate stylesheet.\n...\n return (\n <>\n <Head>\n <link href={styleSheetLink} .../>\n </Head>\n ...\n </>\n )\n...\n}\nRun Code Online (Sandbox Code Playgroud)\n要启用 CSS 优化,您需要安装critters并启用 CSS 优化。
// next.config.js\n...\n experimental: { optimizeCss: true }\n...\n}\nRun Code Online (Sandbox Code Playgroud)\n和
\nyarn add critters\nRun Code Online (Sandbox Code Playgroud)\n