毕业后一直从事js
这一块的工做,没有写过css
,对css
的了解程度还停留在学校自学时的水平。基本功太差,最近开始深刻学习了。javascript
了解到sass
和less
比较流行,决定选一个,这俩的优劣就不讨论了。我选的sass
,由于和ruby
比较亲。css
日常写sass
的时候保存即编译这个是颇有必要的,但最近我一直在用visual studio code开发,这个编辑器还不太成熟,不支持编译sass
的功能,只能本身写脚本去搞了。java
用gulp
来干这活没什么可说的,npm
上搜了一下,看中了gulp-ruby-sass
,由于机器上装了ruby
环境。接下来的剧本就是安装很顺利,使用很潇洒。node
var gulp = require('gulp'); var sass = require('gulp-ruby-sass'); var group = require('gulp-group-files'); var sassFiles = { "xxx" : { src: "./xxx/styles/sass/index.scss", dest: "./xxx/styles/" } }; gulp.task('sass:compile',function (){ return group(sassFiles,function (key,fileset){ return sass(fileset.src) .on('error', function (err) { console.error('compile sass file error: %s', err.message); }) .pipe(gulp.dest(fileset.dest)); })(); }); gulp.task('sass:watch',function (){ gulp.watch('**/*.scss',['sass:compile']) }); gulp.task('default',['sass:watch']);
代码看上去很nice吧,没什么问题,我还有点沾沾自喜呢。然而,今天遇到了这样一个怪事,也就是写这篇文章的由来。npm
当我把须要构建的项目增长了一项后,就出现了问题。talk is cheap
,就直接show u the code
了。gulp
var gulp = require('gulp'); var sass = require('gulp-ruby-sass'); var group = require('gulp-group-files'); var sassFiles = { "xxx" : { src: "./xxx/styles/sass/index.scss", dest: "./xxx/styles/" }, "yyy" : { src: "./yyy/styles/sass/index.scss", dest: "./yyy/styles/" } }; gulp.task('sass:compile',function (){ return group(sassFiles,function (key,fileset){ return sass(fileset.src) .on('error', function (err) { console.error('compile sass file error: %s', err.message); }) .pipe(gulp.dest(fileset.dest)); })(); }); gulp.task('sass:watch',function (){ gulp.watch('**/*.scss',['sass:compile']) }); gulp.task('default',['sass:watch']);
与上面的相比,只是多了一项须要编译的内容。看上去没什么问题,可是呢。编译生成的xxx/styles/index.css
的内容实际为yyy/styles/index.css
,有时也会反过来。sass
一度怀疑是本身代码有问题,改了好几回,问题依旧。没办法,只好去看gulp-ruby-sass
源码了。大体了解了这个插件的原理,以下:ruby
建立临时目录,用来存放编译生成的css
文件;less
调用sass
命令,编译生成的css
文件先放在临时目录;编辑器
将css
文件内容读取成stream
,pipe
到gulp
任务内定义的gulp.dest
,这样就完成了scss
文件的编译和css
文件的生成;
将临时目录和临时文件删除
致使问题的缘由就是这第4步的删除临时文件和目录,连续编译多个文件时只生成了一个临时目录,而第一个文件编译成功后临时目录被删除,后续的文件读取就会出错。根据操做的耗时,可能会取现如下状况:
两个文件中只有一个编译成功
两个文件内容相同(若是文件名相同)
文件内容不符
...
了解到gulp-ruby-sass
的执行过程后,决定弃用,缘由就是上面所列的问题,不想改本身的代码了。
继续npm
上搜索,找到了gulp-sass
。
npm install --save-dev gulp-sass
,一番等待后,npm
报错了。
wtf!!!好吧,就当是好事多磨吧。从npm-debug.log
中能够看出,gulp-sass
依赖了node-sass
这个库。安装node-sass
这个库的时候要执行一个脚本,而在这个过程当中出错了,能够试下管理员身份安装。
用管理员身份再安装,此次成功了,而后改下gulpfile.js
var gulp = require('gulp'); var sass = require('gulp-sass'); var group = require('gulp-group-files'); var sassFiles = { "xxx" : { src: "./xxx/styles/sass/index.scss", dest: "./xxx/styles/" }, "yyy" : { src: "./yyy/styles/sass/index.scss", dest: "./yyy/styles/" } }; gulp.task('sass:compile',function (){ return group(sassFiles,function (key,fileset){ return gulp.src(fileset.src) .pipe(sass().on('error', sass.logError)) .pipe(gulp.dest(fileset.dest)); })(); }); gulp.task('sass:watch',function (){ gulp.watch('**/*.scss',['sass:compile']) }); gulp.task('default',['sass:watch']);
经过查看依赖关系以及部分源码能够发现,gulp-ruby-sass
和gulp-sass
的区别就在于编译器的不一样和编译过程不一样。
gulp-ruby-sass
是调用sass
,因此须要ruby
环境,须要生成临时目录和临时文件
gulp-sass
是调用node-sass
,有node.js
环境就够了,编译过程不须要临时目录和文件,直接经过buffer
内容转换。
搞定这个问题后,就能够愉快地使用了,我又能继续学习css
了。