我对Aurelia和Web开发(如nodejs、gulp等)都很陌生。
幸好使用Aurelia CLI,我可以轻松地在Visual Studio Code中设置一个漂亮的Aurelia项目,并使用Typescript + SASS。我认为使用scoped css是个不错的主意(如果这不是个好主意,请告诉我: ))。虽然有关这个主题的信息已经很多了,但很难找到我真正可以使用的东西。因此,我决定按照以下方式自己实现:
- 我有一些通用样式表,可以在“任何地方”导入。不需要做任何新的工作。
- 将有组件特定的样式表与组件名称匹配+ ".scss"。例如,如果存在视图+模型(component.ts、component.html),则可以有一个component.scss,其中包含特定于component.ts和component.html的样式,并且应该被限制在此组件范围内。
我尝试过使用style scoped html标签,但这在浏览器中并不广泛支持(似乎已从规范中删除?),我也试过一些方法(忘记具体是什么了),就像这里所描述的:
https://github.com/bryanrsmith/aurelia-binding-loader
使用:
<template>
<require from="styles.css!module!bind" as="styles"></require>
<div class.one-time="styles.first">First</div>
<div class.one-time="styles.second">Second</div>
</template>
这个很慢。
我的关于这个的知识非常有限,我认为它将CSS转换为JS对象,然后将标签的类绑定到JS对象中的样式。
我认为在构建时将此转换为JS是有意义的。因此,我使用我非常有限的gulp知识以以下方式更改了process-css.ts:
import * as gulp from 'gulp';
import * as sourcemaps from 'gulp-sourcemaps';
import * as sass from 'gulp-sass';
import * as project from '../aurelia.json';
import { build } from 'aurelia-cli';
import * as path from "path";
import * as fs from "fs";
import * as rename from "gulp-rename";
import * as postcssmodules from "postcss-modules";
import * as postcss from "postcss"
import * as postcssJs from "postcss-js"
import * as tap from "gulp-tap";
export default function processCSS() {
return gulp.src(project.cssProcessor.source)
.pipe(sourcemaps.init())
.pipe(sass().on('error', sass.logError))
.pipe(tap(handleCss))
.pipe(build.bundle())
};
function handleCss(cssFile, t) {
// get the path of the html file
var baseFilename = path.basename(cssFile.path, '.css');
var baseFilepath = path.join(path.dirname(cssFile.path), baseFilename);
var htmlFilepath = baseFilepath + '.html';
// check if the html file exists
if (fs.existsSync(htmlFilepath)) {
var root = postcss.parse(cssFile.contents.toString());
var cssAsJson = postcssJs.objectify(root);
var s = JSON.stringify(cssAsJson);
cssFile.contents = Buffer.from(s);
}
}
(添加handleCss)。
这还没有完成。新的带有样式的对象必须以相同的名称添加到捆绑包中,但是要使用扩展名“.js”。有什么好方法可以做到这一点吗?
如果这样做可以实现,那就太好了,但它仍然只适用于作用域css类,而不是css元素。 我考虑过的另一个可能性是,在构建时将component.scss样式插入到component.html中(例如,设置元素的样式属性)。如果可以这样做,应该如何实现?这样做有什么缺点吗?
如果在这篇文章中有“愚蠢”的问题,请原谅,基本上这一切都很新,很难找到开始的地方。
谢谢!
css_
前缀的类中,并将该类添加到模板标记中(<template class='css_user_list'>
)。这应该有效地限制CSS标签仅适用于该组件内部(及其子级)。 - LStarky.my-component
),因为不能有两个具有相同名称的组件,因此您也永远不会有两个具有相同名称的类。或者,您实际上可以使用一个id
。可以说这正是它的用途(唯一地为单个元素及其后代设置样式)。 - powerbuoy