<p style="text-align: left">
前言
@H_403_3@在微信小程序中,css是用wxss来表示,但写法基本一致。需要注意的是wxss扩展了两个特性,分别是:
- 尺寸单位
- 样式导入
目录结构
@H_403_3@在开发中,我们一般会有一个src源代码目录,一个dist目录用来输出我们打包的代码。而本次讲解用到的目录结构如下: @H_403_3@src的目录结构如下:安装依赖
sass打包配置
@H_403_3@gulp配置打包sass非常简单,代码如下:.pipe(sass().on('error',sass.logError))
.pipe(rename({
extname: '.wxss'
}))
.pipe(gulp.dest('./dist'))
);
解决import导入问题
@H_403_3@那如何解决import的导入问题呢,其实也比较简单,说白了就是sass处理的时候,让其不处理import部分的语句就可以了。有两种方式可以做到,第一种是改写sass处理的源码,当遇到import语句时跳过。第二种是,在把文件交给sass处理前,我们先把import语句部分注释掉,这样sass处理的时候就会忽略了,当sass处理完成后,再把注释掉的语句打开即可。显然第一种成本比较高,也不好维护。我们采用第二种,代码如下:const hasRmCssFiles = new Set();
gulp.task('sass',wxss}')
.pipe(tap((file) => {
// 当前处理文件的路径
const filePath = path.dirname(file.path);
// 当前处理内容
const content = file.contents.toString();
// 找到filter的scss,并匹配是否在配置文件中
content.replace(/@import\s+'|"['|"];/g,($1,$2) => {
const hasFilter = config.cssFilterFiles.filter(item => $2.indexOf(item) > -1);
// hasFilter > 0表示filter的文件在配置文件中,打包完成后需要删除
if (hasFilter.length > 0) {
const rmPath = path.join(filePath,$2);
// 将src改为dist,.scss改为.wxss,例如:'/xxx/src/scss/const.scss' => '/xxx/dist/scss/const.wxss'
const filea = rmPath.replace(/src/,'dist').replace(/.scss/,'.wxss');
// 加入待删除列表
hasRmCssFiles.add(filea);
}
});
console.log('rm',hasRmCssFiles);
}))
.pipe(replace(/(@import.+;)/g,$2) => {
const hasFilter = config.cssFilterFiles.filter(item => $1.indexOf(item) > -1);
if (hasFilter.length > 0) {
return $2;
}
return /** ${$2} **/
;
}))
.pipe(sass().on('error',sass.logError))
.pipe(replace(/(\/**\s{0,})(@.+)(\s{0,}**\/)/g,$2,$3) => $3.replace(/.scss/g,'.wxss')))
.pipe(rename({
extname: '.wxss',}))
.pipe(gulp.dest('./dist')));
清理无用的wxss文件
@H_403_3@前面讲了,我们在sass中可能会定义一些变量,函数,这些文件一会一并打包到dist目录,但其内容是空的,这时候我们就需要对其进行清理,前面在打包过程中,我们有一个set变量hasRmCssFiles
记录了相应的文件,这样我们遍历这个变量即可删除相应的文件,代码如下: