Gulp SASS - 使用@import 不编译 scss -> css

Gulp SASS - Use @import without compiling scss -> css

我知道这可能是一个奇怪的问题,但请坚持。 :)

是否可以使用 gulp sass(或其他 gulp 插件)读取带有多个 @import 语句的单个 .scss 文件,以及 import/concat 所有这些@import-ed 文件到单个.scss 文件 编译为CSS?

背景信息:我采用了 Bootstrap 和 FontAwesome 基础 .scss 文件并将它们组合成一个主 .scss 文件。我现在想将 @import 语句中的所有文件放入一个 .scss 文件中。

我想到的另一个选择是只使用一个连接工具,但是这样我就不必手动指定要在 gulp 文件中连接的每个文件了吗?如果我错了,请纠正我。

我正在寻找的示例:

//base.scss
@import foo;
@import bar;

进口

//foo.scss
$my-font-size:20px;

//bar.scss
body {
  div {
    font-size:$my-font-size;
  }
}

制作

//final.scss
$my-font-size:20px;
body {
  div {
    font-size:$my-font-size;
  }
}

请注意 @imports 包含在 final.scss 文件中,但 SCSS -> CSS.[=19 中没有任何编译=]

是的,您可以为此使用 gulp-scss 或 gulp-ruby-sass。现在有一些 Gulp 已经存在了一段时间。

gulp-sass 编译 sass 文件 https://www.npmjs.com/package/gulp-sass

gulp-rename to 重命名分发文件夹的文件 https://www.npmjs.com/package/gulp-rename

就我而言,我目前正在使用 gulp-scss。你可以像这样简单地 运行 一个任务来满足你的需要。在下面的示例中,base.scss 将是包含所有 @import 语句的 scss 文件。

var gulp   = require('gulp'),
    scss   = require('gulp-scss'),
    rename = require('gulp-rename');

gulp.task('sass', function () {
  gulp.src('base.scss')
    .pipe(scss())
    .pipe(rename('final.scss'))
    .pipe(gulp.dest('assets/css/'));
});

更新:

假设您已经创建了 base.scss,其中已经包含您的导入语句。上面的方法应该有效。我们只需在提供的文件上 运行 scss 任务,重命名它,然后将其移动到您的目标目录中。

更新 2

保留变量将需要您使用 concat 方法,因为所有 sass 插件仅用于将 sass 编译为 css。您不需要指定所有文件。首先是变量,然后你可以 运行 一个 glob 用于你所有的自定义 sass。只需确保您遵循下面数组中的类似文件夹结构,以正确分离和组织资产。

您也无需担心维护导入文件。不需要它,用这种方法管理起来会更少。

var gulp   = require('gulp'),
    concat = require('gulp-concat');

var sassConcat = [
  'sass/variables.scss',
  'sass/modules/**/*.scss'
];

gulp.task('sass', function () {
  gulp.src(sassConcat)
  .pipe(concat('final.scss'))
  .pipe(gulp.dest('../assets/sass/'));
};

我偶然发现了同样的问题。这个会帮助你。虽然有一些缺陷(忘记带下划线前缀的文件名 - 这是我到目前为止发现的)。

the npm package that is build especially for this purpose

免责声明:我不会解释 npm 是如何工作的,我假设作者如果想使用 gulp 插件就知道什么是 npm 包。请不要删除我的答案只是因为我没有不必要地明确描述什么是显而易见的 提出问题的人。 为了防止由于缺乏上下文而删除此答案,我引用了包描述。

import resolve
resolve @import statements in stylesheets

What this does
What if you have some less or stylus files that you want to smash together into a master file, without compiling to css? Just use import-resolve and all your dreams will come true. All @import statements will be resolved and you'll be left with one file containing all your precious mixins, variables and declarations.

Using import-resolve

npm install import-resolve
// some-node-thing.js 
var importResolve = require('import-resolve');

// spits out a master dist file with all your wonderful stylesheet 
// things concatenated 
importResolve({
    "ext": "less",
    "pathToMain": "path/to/main.less",
    "output": "path/to/output.less"
});

// if you don't specify an output file, output accepts a callback parameter 
// and passes the concatenated file text 
var output = importResolve({
    "ext": "styl",
    "pathToMain": "path/to/main.styl"
}, function (output) {
    fs.writeFile('foo.styl', output, function (){
        console.log('did it myself.');
    });
});