为单个 js 文件生成 SourceMaps,其中包含带有 npm require 和 gulp 的模块
Generate SourceMaps for a single js file which includes modules with npm require and gulp
我将直接从我的代码结构示例开始。假设以下三个普通文件驻留在名为 /path/from/root/js/src
的同一目录中
module1.js:
console.log(1);
module2.js:
console.log(2);
app.js:
require('./module1');
require('./module2');
然后,我正在使用以下 gulp 任务将 javascript 编译成一个包含 gulp 的文件:
var gulp = require('gulp');
var sourcemaps = require('gulp-sourcemaps');
var path = require('path');
var browserify = require('gulp-browserify');
gulp.task('default', function() {
gulp.src(['./js/src/app.js'])
.pipe(sourcemaps.init())
.pipe(browserify()).on('error', function(err){
console.log(err);
})
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest(function( file ) {
file.base = path.dirname(file.path);
return path.join(path.dirname(file.path), '/../');
}))
});
在 运行 gulp
之后,我得到了编译后的 javascript app.js
,它只记录了 1 2 和预期的 app.js.map
,但是没有在浏览器中引用原始文件。
您可以通过查看控制台第 1 行和第 2 行来检查,它们是由 app.js
引用的,而不是由 module1|2.js
引用的。如果我需要修复一个错误,随着我的项目中的文件越来越大,我不知道将来哪个文件会生成控制台符号。
我做错了什么?我没有正确使用 sourcemaps 吗?
app.js.map
文件没有引用模块,它看起来像这样:
{
"version":3,
"names":[],
"mappings":"",
"sources":["app.js"],
"sourcesContent":["require('./module1');\r\nrequire('./module2');"],
"file":"app.js"
}
使用汇总
在尝试了各种东西并在线构建包之后,我找到了使用 rollup
而不是 browserify
来解决我的问题的方法。如果有人感兴趣,我会在这里添加我的基本用法的简单构建和汇总:
module1.js
和 module2.js
保持不变。
app.js
变为
import {m1} from './module1';
import {m2} from './module2';
我的 gulpfile 变成了
var gulp = require('gulp'),
rollup = require('rollup')
;
gulp.task('default', function () {
return rollup.rollup({
entry: "./js/src/app.js",
})
.then(function (bundle) {
bundle.write({
format: "umd",
moduleName: "library",
dest: "./js/app.js",
sourceMap: true
});
})
});
现在打开包含 /js/app.js
的 html 文件,您会在控制台中看到 module1.js
引用了 1
,2
引用了 module2.js
看起来 rollup 默认不支持 require
,但 import {...} from ...
语法更简约并且是 ES6 的一部分,所以我最好开始使用它。
来自官方文档的来源:https://rollupjs.org/#using-rollup-with-gulp
进一步阅读更复杂的构建(我还没有完成这些步骤,但看起来很有希望):https://github.com/rollup/rollup-starter-project
所有人都为它给我们带来的麻烦欢呼Javascript!
我找到了一个更相关的问题解决方案,所以我正在为它创建一个新的答案。我注意到我使用的 gulp-browserify
包已被弃用,所以我检查了更新的用法。
我的 package.json
依赖项是:
"devDependencies": {
"babel-preset-es2015": "^6.24.1",
"babelify": "^7.3.0",
"browserify": "^14.4.0",
"gulp": "^3.9.1",
"gulp-sourcemaps": "^2.6.0",
"gulp-uglify": "^3.0.0",
"gulp-util": "^3.0.8",
"vinyl-buffer": "^1.0.0",
"vinyl-source-stream": "^1.1.0"
}
我的 gulpfile.js
的基本构建如下所示:
'use strict';
var browserify = require('browserify');
var gulp = require('gulp');
var source = require('vinyl-source-stream');
var buffer = require('vinyl-buffer');
var uglify = require('gulp-uglify');
var sourcemaps = require('gulp-sourcemaps');
var gutil = require('gulp-util');
gulp.task('default', function () {
// set up the browserify instance on a task basis
var b = browserify({
entries: './js/src/app.js',
debug: true
}).transform("babelify", {presets: ["es2015"]});
return b.bundle()
.pipe(source('app.js'))
.pipe(buffer())
.pipe(sourcemaps.init({loadMaps: true}))
// Add transformation tasks to the pipeline here.
//.pipe(uglify())
.on('error', gutil.log)
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest('./js/'));
});
对于生产构建,您可以取消对 uglify 命令的注释。
Babelify 允许使用 ES5 语法(未测试,但您可能也可以改用 *2017 包)。
来源:
1. Gulp setup for Browserify
2. Babel setup for Browserify
我将直接从我的代码结构示例开始。假设以下三个普通文件驻留在名为 /path/from/root/js/src
module1.js:
console.log(1);
module2.js:
console.log(2);
app.js:
require('./module1');
require('./module2');
然后,我正在使用以下 gulp 任务将 javascript 编译成一个包含 gulp 的文件:
var gulp = require('gulp');
var sourcemaps = require('gulp-sourcemaps');
var path = require('path');
var browserify = require('gulp-browserify');
gulp.task('default', function() {
gulp.src(['./js/src/app.js'])
.pipe(sourcemaps.init())
.pipe(browserify()).on('error', function(err){
console.log(err);
})
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest(function( file ) {
file.base = path.dirname(file.path);
return path.join(path.dirname(file.path), '/../');
}))
});
在 运行 gulp
之后,我得到了编译后的 javascript app.js
,它只记录了 1 2 和预期的 app.js.map
,但是没有在浏览器中引用原始文件。
您可以通过查看控制台第 1 行和第 2 行来检查,它们是由 app.js
引用的,而不是由 module1|2.js
引用的。如果我需要修复一个错误,随着我的项目中的文件越来越大,我不知道将来哪个文件会生成控制台符号。
我做错了什么?我没有正确使用 sourcemaps 吗?
app.js.map
文件没有引用模块,它看起来像这样:
{
"version":3,
"names":[],
"mappings":"",
"sources":["app.js"],
"sourcesContent":["require('./module1');\r\nrequire('./module2');"],
"file":"app.js"
}
使用汇总
在尝试了各种东西并在线构建包之后,我找到了使用 rollup
而不是 browserify
来解决我的问题的方法。如果有人感兴趣,我会在这里添加我的基本用法的简单构建和汇总:
module1.js
和 module2.js
保持不变。
app.js
变为
import {m1} from './module1';
import {m2} from './module2';
我的 gulpfile 变成了
var gulp = require('gulp'),
rollup = require('rollup')
;
gulp.task('default', function () {
return rollup.rollup({
entry: "./js/src/app.js",
})
.then(function (bundle) {
bundle.write({
format: "umd",
moduleName: "library",
dest: "./js/app.js",
sourceMap: true
});
})
});
现在打开包含 /js/app.js
的 html 文件,您会在控制台中看到 module1.js
引用了 1
,2
引用了 module2.js
看起来 rollup 默认不支持 require
,但 import {...} from ...
语法更简约并且是 ES6 的一部分,所以我最好开始使用它。
来自官方文档的来源:https://rollupjs.org/#using-rollup-with-gulp
进一步阅读更复杂的构建(我还没有完成这些步骤,但看起来很有希望):https://github.com/rollup/rollup-starter-project
所有人都为它给我们带来的麻烦欢呼Javascript!
我找到了一个更相关的问题解决方案,所以我正在为它创建一个新的答案。我注意到我使用的 gulp-browserify
包已被弃用,所以我检查了更新的用法。
我的 package.json
依赖项是:
"devDependencies": {
"babel-preset-es2015": "^6.24.1",
"babelify": "^7.3.0",
"browserify": "^14.4.0",
"gulp": "^3.9.1",
"gulp-sourcemaps": "^2.6.0",
"gulp-uglify": "^3.0.0",
"gulp-util": "^3.0.8",
"vinyl-buffer": "^1.0.0",
"vinyl-source-stream": "^1.1.0"
}
我的 gulpfile.js
的基本构建如下所示:
'use strict';
var browserify = require('browserify');
var gulp = require('gulp');
var source = require('vinyl-source-stream');
var buffer = require('vinyl-buffer');
var uglify = require('gulp-uglify');
var sourcemaps = require('gulp-sourcemaps');
var gutil = require('gulp-util');
gulp.task('default', function () {
// set up the browserify instance on a task basis
var b = browserify({
entries: './js/src/app.js',
debug: true
}).transform("babelify", {presets: ["es2015"]});
return b.bundle()
.pipe(source('app.js'))
.pipe(buffer())
.pipe(sourcemaps.init({loadMaps: true}))
// Add transformation tasks to the pipeline here.
//.pipe(uglify())
.on('error', gutil.log)
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest('./js/'));
});
对于生产构建,您可以取消对 uglify 命令的注释。 Babelify 允许使用 ES5 语法(未测试,但您可能也可以改用 *2017 包)。
来源:
1. Gulp setup for Browserify
2. Babel setup for Browserify