Gulp SASS Sourcemap 来源不正确
Gulp SASS Sourcemap sources are incorrect
我正在努力让我的 SASS 源映射正常工作。问题似乎是 sourcemap 中的 "sources" 属性以及我的 SASS 文件是如何嵌套的。
我有一个 Gulp 任务将 SASS 编译为 CSS。这是一个例子
var paths = {
styles: {
src: './Stylesheets/SCSS/',
files: './Stylesheets/SCSS/**/*.scss',
dest: './Stylesheets/CSS/'
}
}
gulp.task('compile-sass', function (){
return gulp.src(paths.styles.files)
.pipe(sourcemaps.init())
.pipe(sass({
outputStyle: 'compressed',
includePaths : [paths.styles.src]
}))
.pipe(prefix({
browsers: ['last 2 Chrome versions'],
cascade: false
}))
.pipe(sourcemaps.write('../Maps/', {
includeContent: false,
sourceRoot: '../SCSS'
}))
.pipe(gulp.dest(paths.styles.dest));
});
以上内容适用于其他一切——将映射写入磁盘、添加前缀等。我使用的是最新的 nodejs、gulpjs 和相关的 npm 包。
我的 Stylesheets 文件夹中的 folder/asset 结构示例:
SCSS/print.scss
SCSS/sectionA/style.scss
SCSS/sectionA/partial/_partialA.scss
SCSS/sectionA/partial/_partialB.scss
SCSS/sectionB/... etc
对于 SCSS/ 根目录中的 SASS 个文件,sourcemaps 工作正常。 Chrome 将显示源样式所在的位置。
对于 SCSS/ 子文件夹中的 SASS 文件,源映射不起作用。问题是 "sources": 属性中列出了错误的文件。
例如 print.scss 地图将正确地具有 "sources":["print.scss"]
。但是 sectionA/style.scss 地图将有 "sources":["style.css"]
而不是我期望的 "sources":["partial/_partialA.scss", "partial/_partialB.scss"]
。
我已确认将 /SCSS/sectionA/style.scss 移动到 /SCSS/style.scss 并修改任何导入路径确实可以解决问题。但我需要它是嵌套的,而不是在 /SCSS.
的根目录中
如果我可以提供更多详细信息,请告诉我。我已经尝试了 Path to source map is wrong 的答案,但它并没有解决我的问题。我也试过操纵 mapSources
但无济于事。
@更新2019-05-24
我的回答是关于使用CSSNext。 CSSNext was deprecated. The theory in my answer is still applicable using postcss-preset-env.
@更新2017-03-08
在使用 PostCSS 进行试验后,我使用 CSSNext 在 SASS 转换后处理 CSS。 CSSNext 自动添加前缀并以这种方式保留与 sourcemap 中原始 scss 文件的连接。
查看我的 GitHub 存储库示例。
在听取了 Mark 的反馈并调查了 gulp-autoprefixer 模块后,我相信 GitHub 仓库中针对 gulp-autoprefixer 提出的这个 issue 与错误相关sourceroot 问题。
使用 ByScripts 的 hack 变体,我能够为嵌套的 scss 文件获取具有正确 sourceroot 的源映射。 ByScripts gulp 文件中使用的 hack 两次初始化 sourcemaps 函数。前缀前一次,前缀后一次。
我创建了一个 GitHub 存储库来尝试说明一个简化的测试用例和一个 workaround。检查变通方法产生的 css 显示返回源 scss.
的正确关系
我正在努力让我的 SASS 源映射正常工作。问题似乎是 sourcemap 中的 "sources" 属性以及我的 SASS 文件是如何嵌套的。
我有一个 Gulp 任务将 SASS 编译为 CSS。这是一个例子
var paths = {
styles: {
src: './Stylesheets/SCSS/',
files: './Stylesheets/SCSS/**/*.scss',
dest: './Stylesheets/CSS/'
}
}
gulp.task('compile-sass', function (){
return gulp.src(paths.styles.files)
.pipe(sourcemaps.init())
.pipe(sass({
outputStyle: 'compressed',
includePaths : [paths.styles.src]
}))
.pipe(prefix({
browsers: ['last 2 Chrome versions'],
cascade: false
}))
.pipe(sourcemaps.write('../Maps/', {
includeContent: false,
sourceRoot: '../SCSS'
}))
.pipe(gulp.dest(paths.styles.dest));
});
以上内容适用于其他一切——将映射写入磁盘、添加前缀等。我使用的是最新的 nodejs、gulpjs 和相关的 npm 包。
我的 Stylesheets 文件夹中的 folder/asset 结构示例:
SCSS/print.scss
SCSS/sectionA/style.scss
SCSS/sectionA/partial/_partialA.scss
SCSS/sectionA/partial/_partialB.scss
SCSS/sectionB/... etc
对于 SCSS/ 根目录中的 SASS 个文件,sourcemaps 工作正常。 Chrome 将显示源样式所在的位置。
对于 SCSS/ 子文件夹中的 SASS 文件,源映射不起作用。问题是 "sources": 属性中列出了错误的文件。
例如 print.scss 地图将正确地具有 "sources":["print.scss"]
。但是 sectionA/style.scss 地图将有 "sources":["style.css"]
而不是我期望的 "sources":["partial/_partialA.scss", "partial/_partialB.scss"]
。
我已确认将 /SCSS/sectionA/style.scss 移动到 /SCSS/style.scss 并修改任何导入路径确实可以解决问题。但我需要它是嵌套的,而不是在 /SCSS.
的根目录中如果我可以提供更多详细信息,请告诉我。我已经尝试了 Path to source map is wrong 的答案,但它并没有解决我的问题。我也试过操纵 mapSources
但无济于事。
@更新2019-05-24
我的回答是关于使用CSSNext。 CSSNext was deprecated. The theory in my answer is still applicable using postcss-preset-env.
@更新2017-03-08
在使用 PostCSS 进行试验后,我使用 CSSNext 在 SASS 转换后处理 CSS。 CSSNext 自动添加前缀并以这种方式保留与 sourcemap 中原始 scss 文件的连接。
查看我的 GitHub 存储库示例。
在听取了 Mark 的反馈并调查了 gulp-autoprefixer 模块后,我相信 GitHub 仓库中针对 gulp-autoprefixer 提出的这个 issue 与错误相关sourceroot 问题。
使用 ByScripts 的 hack 变体,我能够为嵌套的 scss 文件获取具有正确 sourceroot 的源映射。 ByScripts gulp 文件中使用的 hack 两次初始化 sourcemaps 函数。前缀前一次,前缀后一次。
我创建了一个 GitHub 存储库来尝试说明一个简化的测试用例和一个 workaround。检查变通方法产生的 css 显示返回源 scss.
的正确关系