将 BEM Sass 与 Next 和 Typescript 集成
Integrating BEM Sass with Next and Typescript
我正在尝试将静态 Sass Bem 项目重构为 Typescript NextJS 应用程序。
加载 main.scss 冻结应用程序
我曾经使用 node-sass 生成一个 CSS 文件,但现在我想加载每个组件及其相应的样式。
当我在组件中加载每个 SCSS 文件时出现错误,因为我的 SCSS 变量在抽象文件夹中被外部化了。
我当前的下一个配置如下:
// next.config.js
```const withSass = require("@zeit/next-sass");
module.exports = withSass({
sassLoaderOptions: {}
});
```
我的 BEM 文件夹结构:
我的问题是:有没有办法将 BEM 结构集成到 Next 应用程序中,或者我应该将 SCSS 文件分解为与每个组件对应的文件?
另外,我生成了一个 CSS 文件,接下来会根据正在加载的组件将其分块,还是会在第一次加载时全部发送?
1)是的,你可以做到。您可以通过@import 在 main.scss 中积累所有样式,并将其导入应用程序的 "entrypoint" 中。据我了解,您是这样做的,但遇到了一些冻结问题。尝试 this official example of integrating with sass. For your mixins & variables defined in BEM folders and imported in main.scss to be accessible through whole app you should try sass-resource-loader。您可以尝试以下配置:
const withSass = require("@zeit/next-sass");
const resourcesLoader = {
loader: "sass-resources-loader",
options: {
resources: [
"./sass/_breakpoint.scss",
"./sass/_mediaqueries.scss",
"./sass/_variables.scss"
]
}
};
module.exports = withSass({
cssModules: true,
cssLoaderOptions: {
importLoaders: 1,
localIdentName: "[name]__[local]___[hash:base64:5]"
},
webpack: (config, options) => {
config.module.rules.map(rule => {
if (
rule.test.source.includes("scss") ||
rule.test.source.includes("sass")
) {
rule.use.push(resourcesLoader);
}
});
return config;
}
});
如果有帮助,我已从 here 中获取。
2) 我不确定这一点,但据我了解 Next.js 仅在需要时同时提供 js 和 css,因此如果您在页面内导入一些单独的样式表,它只会在您加载此样式表时进入这个特定的页面。
所以经过一些挖掘后发现 next-sass 工作正常,不需要任何外部配置。
在全局布局中导入 mains.scss 足以使其工作,但需要注意的一件事是,在 main.scss 中我必须添加局部扩展。
所以我没有 @import "abstracts/functions";
@import "abstracts/functions.scss";
我正在尝试将静态 Sass Bem 项目重构为 Typescript NextJS 应用程序。
加载 main.scss 冻结应用程序
我曾经使用 node-sass 生成一个 CSS 文件,但现在我想加载每个组件及其相应的样式。
当我在组件中加载每个 SCSS 文件时出现错误,因为我的 SCSS 变量在抽象文件夹中被外部化了。
我当前的下一个配置如下:
// next.config.js
```const withSass = require("@zeit/next-sass");
module.exports = withSass({
sassLoaderOptions: {}
});
```
我的 BEM 文件夹结构:
我的问题是:有没有办法将 BEM 结构集成到 Next 应用程序中,或者我应该将 SCSS 文件分解为与每个组件对应的文件?
另外,我生成了一个 CSS 文件,接下来会根据正在加载的组件将其分块,还是会在第一次加载时全部发送?
1)是的,你可以做到。您可以通过@import 在 main.scss 中积累所有样式,并将其导入应用程序的 "entrypoint" 中。据我了解,您是这样做的,但遇到了一些冻结问题。尝试 this official example of integrating with sass. For your mixins & variables defined in BEM folders and imported in main.scss to be accessible through whole app you should try sass-resource-loader。您可以尝试以下配置:
const withSass = require("@zeit/next-sass");
const resourcesLoader = {
loader: "sass-resources-loader",
options: {
resources: [
"./sass/_breakpoint.scss",
"./sass/_mediaqueries.scss",
"./sass/_variables.scss"
]
}
};
module.exports = withSass({
cssModules: true,
cssLoaderOptions: {
importLoaders: 1,
localIdentName: "[name]__[local]___[hash:base64:5]"
},
webpack: (config, options) => {
config.module.rules.map(rule => {
if (
rule.test.source.includes("scss") ||
rule.test.source.includes("sass")
) {
rule.use.push(resourcesLoader);
}
});
return config;
}
});
如果有帮助,我已从 here 中获取。 2) 我不确定这一点,但据我了解 Next.js 仅在需要时同时提供 js 和 css,因此如果您在页面内导入一些单独的样式表,它只会在您加载此样式表时进入这个特定的页面。
所以经过一些挖掘后发现 next-sass 工作正常,不需要任何外部配置。
在全局布局中导入 mains.scss 足以使其工作,但需要注意的一件事是,在 main.scss 中我必须添加局部扩展。
所以我没有 @import "abstracts/functions";
@import "abstracts/functions.scss";