Skip to content

Commit 0431b74

Browse files
committed
added cheap-source-map and lineToLine option
1 parent f61b563 commit 0431b74

10 files changed

Lines changed: 143 additions & 33 deletions

benchmark/benchmark.js

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,20 @@ var tests = {
3838
deferred.resolve();
3939
});
4040
}],
41+
"eval dev build": [[0, 1, 2, 5, 10, 15], function(size, deferred) {
42+
webpack({
43+
context: fixtures,
44+
entry: "./" + size + ".big.js",
45+
output: {
46+
path: outputPath,
47+
filename: "bundle.js"
48+
},
49+
devtool: "eval"
50+
}, function(err, stats) {
51+
if(err) throw err;
52+
deferred.resolve();
53+
})
54+
}],
4155
"sourcemap build": [[0, 1, 2, 5, 10, 15], function(size, deferred) {
4256
webpack({
4357
context: fixtures,
@@ -52,6 +66,33 @@ var tests = {
5266
deferred.resolve();
5367
})
5468
}],
69+
"cheap sourcemap build": [[0, 1, 2, 5, 10, 15], function(size, deferred) {
70+
webpack({
71+
context: fixtures,
72+
entry: "./" + size + ".big.js",
73+
output: {
74+
path: outputPath,
75+
filename: "bundle.js"
76+
},
77+
devtool: "cheap-source-map"
78+
}, function(err, stats) {
79+
if(err) throw err;
80+
deferred.resolve();
81+
})
82+
}],
83+
"build w/ chunks": [[0, 1, 5, 10, 50, 100, 200], function(size, deferred) {
84+
webpack({
85+
context: fixtures,
86+
entry: "./" + size + ".async.js",
87+
output: {
88+
path: outputPath,
89+
filename: "bundle.js"
90+
}
91+
}, function(err, stats) {
92+
if(err) throw err;
93+
deferred.resolve();
94+
})
95+
}],
5596
"build w/ chunks": [[0, 1, 5, 10, 50, 100, 200], function(size, deferred) {
5697
webpack({
5798
context: fixtures,
@@ -77,6 +118,19 @@ var tests = {
77118
});
78119
runTimes(compiler, 2, deferred);
79120
}],
121+
"incremental cheap sourcemap": [[1, 2, 3, 4, 5, 6], function(size, deferred) {
122+
var compiler = webpack({
123+
cache: true,
124+
context: fixtures,
125+
entry: "./200.js",
126+
output: {
127+
path: outputPath,
128+
filename: "bundle.js"
129+
},
130+
devtool: "cheap-source-map"
131+
});
132+
runTimes(compiler, size, deferred);
133+
}],
80134
"incremental2": [[0, 1, 5, 10, 50, 100, 200], function(size, deferred) {
81135
var compiler = webpack({
82136
cache: true,
@@ -117,7 +171,11 @@ var tests = {
117171

118172
var suite = new Benchmark.Suite;
119173

120-
Object.keys(tests).forEach(function(name) {
174+
Object.keys(tests).filter(function(name) {
175+
if(process.argv.length > 2)
176+
return name.indexOf(process.argv[2]) >= 0;
177+
return true;
178+
}).forEach(function(name) {
121179
var test = tests[name];
122180
test[0].forEach(function(size) {
123181
suite.add(name + " " + size, function(deferred) {

lib/Compilation.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,7 @@ Compilation.prototype.createChunkAssets = function createChunkAssets() {
788788
if(this.cache) {
789789
this.cache["c" + chunk.id] = {
790790
hash: usedHash,
791-
source: source instanceof CachedSource ? source : new CachedSource(source)
791+
source: source = (source instanceof CachedSource ? source : new CachedSource(source))
792792
}
793793
}
794794
}

lib/EvalSourceMapDevToolModuleTemplatePlugin.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,27 @@
55
var RawSource = require("webpack-core/lib/RawSource");
66
var ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
77

8-
function EvalSourceMapDevToolModuleTemplatePlugin(compilation, sourceMapComment, moduleFilenameTemplate) {
8+
function EvalSourceMapDevToolModuleTemplatePlugin(compilation, options, sourceMapComment, moduleFilenameTemplate) {
99
this.compilation = compilation;
1010
this.sourceMapComment = sourceMapComment || "//@ sourceMappingURL=[url]";
1111
this.moduleFilenameTemplate = moduleFilenameTemplate || "webpack:///[resource-path]?[hash]";
12+
this.options = options;
1213
}
1314
module.exports = EvalSourceMapDevToolModuleTemplatePlugin;
1415

1516
EvalSourceMapDevToolModuleTemplatePlugin.prototype.apply = function(moduleTemplate) {
1617
var self = this;
18+
var options = this.options;
1719
moduleTemplate.plugin("module", function(source, module, chunk) {
1820
if(source.__EvalSourceMapDevTool_Data)
1921
return source.__EvalSourceMapDevTool_Data;
2022

2123
if(source.sourceAndMap) {
22-
var sourceAndMap = source.sourceAndMap();
24+
var sourceAndMap = source.sourceAndMap(options);
2325
var sourceMap = sourceAndMap.map;
2426
var content = sourceAndMap.source;
2527
} else {
26-
var sourceMap = source.map();
28+
var sourceMap = source.map(options);
2729
var content = source.source();
2830
}
2931
if(!sourceMap) {

lib/EvalSourceMapDevToolPlugin.js

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,23 @@
33
Author Tobias Koppers @sokra
44
*/
55
var EvalSourceMapDevToolModuleTemplatePlugin = require("./EvalSourceMapDevToolModuleTemplatePlugin");
6+
var SourceMapDevToolModuleOptionsPlugin = require("./SourceMapDevToolModuleOptionsPlugin");
67

7-
function EvalSourceMapDevToolPlugin(sourceMapComment, moduleFilenameTemplate) {
8-
this.sourceMapComment = sourceMapComment;
9-
this.moduleFilenameTemplate = moduleFilenameTemplate;
8+
function EvalSourceMapDevToolPlugin(options, moduleFilenameTemplate) {
9+
if(!options || typeof options !== "object") {
10+
this.options = {
11+
append: options,
12+
moduleFilenameTemplate: moduleFilenameTemplate
13+
};
14+
} else {
15+
this.options = options;
16+
}
1017
}
1118
module.exports = EvalSourceMapDevToolPlugin;
1219
EvalSourceMapDevToolPlugin.prototype.apply = function(compiler) {
13-
var self = this;
20+
var options = this.options;
1421
compiler.plugin("compilation", function(compilation) {
15-
compilation.plugin("build-module", function(module) {
16-
module.useSourceMap = true;
17-
});
18-
compilation.moduleTemplate.apply(new EvalSourceMapDevToolModuleTemplatePlugin(compilation, self.sourceMapComment, self.moduleFilenameTemplate));
22+
new SourceMapDevToolModuleOptionsPlugin(options).apply(compilation);
23+
compilation.moduleTemplate.apply(new EvalSourceMapDevToolModuleTemplatePlugin(compilation, options, options.append, options.moduleFilenameTemplate));
1924
});
20-
};
25+
};

lib/MainTemplate.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ function MainTemplate(outputOptions) {
2222
var source = new ConcatSource();
2323
source.add("/******/ (function(modules) { // webpackBootstrap\n");
2424
source.add(new PrefixSource("/******/", bootstrapSource));
25-
source.add("\n/******/ })\n");
25+
source.add("/******/ })\n");
2626
source.add("/************************************************************************/\n");
2727
source.add("/******/ (");
2828
var modules = this.renderChunkModules(chunk, moduleTemplate, dependencyTemplates, "/******/ ");
@@ -109,7 +109,7 @@ MainTemplate.prototype.render = function(hash, chunk, moduleTemplate, dependency
109109
buf.push("");
110110
buf.push(this.asString(this.applyPluginsWaterfall("require-extensions", "", chunk, hash)));
111111
buf.push(this.asString(this.applyPluginsWaterfall("startup", "", chunk, hash)));
112-
var source = this.applyPluginsWaterfall("render", new OriginalSource(this.prefix(buf, " \t"), "webpack/bootstrap " + hash), chunk, hash, moduleTemplate, dependencyTemplates);
112+
var source = this.applyPluginsWaterfall("render", new OriginalSource(this.prefix(buf, " \t") + "\n", "webpack/bootstrap " + hash), chunk, hash, moduleTemplate, dependencyTemplates);
113113
if(chunk.modules.some(function(module) {
114114
return (module.id === 0);
115115
})) {
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
var ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
6+
7+
function SourceMapDevToolModuleOptionsPlugin(options) {
8+
this.options = options;
9+
}
10+
11+
module.exports = SourceMapDevToolModuleOptionsPlugin;
12+
13+
SourceMapDevToolModuleOptionsPlugin.prototype.apply = function(compilation) {
14+
var options = this.options;
15+
if(options.module !== false) {
16+
compilation.plugin("build-module", function(module) {
17+
module.useSourceMap = true;
18+
});
19+
}
20+
if(options.lineToLine === true) {
21+
compilation.plugin("build-module", function(module) {
22+
module.lineToLine = true;
23+
});
24+
} else if(options.lineToLine) {
25+
compilation.plugin("build-module", function(module) {
26+
if(!module.resource) return;
27+
var resourcePath = module.resource;
28+
var idx = resourcePath.indexOf("?");
29+
if(idx >= 0) resourcePath = resourcePath.substr(0, idx);
30+
module.lineToLine = ModuleFilenameHelpers.matchObject(options.lineToLine, resourcePath);
31+
});
32+
}
33+
};

lib/SourceMapDevToolPlugin.js

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ var RequestShortener = require("./RequestShortener");
77
var Template = require("./Template");
88
var ConcatSource = require("webpack-core/lib/ConcatSource");
99
var RawSource = require("webpack-core/lib/RawSource");
10-
var CheapOriginalSource = require("webpack-core/lib/CheapOriginalSource")
1110
var ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
11+
var SourceMapDevToolModuleOptionsPlugin = require("./SourceMapDevToolModuleOptionsPlugin");
1212

1313
function SourceMapDevToolPlugin(options, sourceMappingURLComment, moduleFilenameTemplate, fallbackModuleFilenameTemplate) {
1414
if(!options || typeof options !== "object") {
@@ -22,7 +22,6 @@ function SourceMapDevToolPlugin(options, sourceMappingURLComment, moduleFilename
2222
this.sourceMappingURLComment = options.append === false ? false : options.append || "\n//# sourceMappingURL=[url]";
2323
this.moduleFilenameTemplate = options.moduleFilenameTemplate || "webpack:///[resourcePath]";
2424
this.fallbackModuleFilenameTemplate = options.fallbackModuleFilenameTemplate || "webpack:///[resourcePath]?[hash]";
25-
this.cheapMode = options.cheapMode;
2625
this.options = options;
2726
}
2827
}
@@ -33,20 +32,10 @@ SourceMapDevToolPlugin.prototype.apply = function(compiler) {
3332
var moduleFilenameTemplate = this.moduleFilenameTemplate;
3433
var fallbackModuleFilenameTemplate = this.fallbackModuleFilenameTemplate;
3534
var requestShortener = new RequestShortener(compiler.context);
36-
var cheapMode = this.cheapMode;
3735
var options = this.options;
3836
options.test = options.test || /\.js($|\?)/i;
3937
compiler.plugin("compilation", function(compilation) {
40-
if(cheapMode) {
41-
compilation.moduleTemplate.plugin("module", function(source, module) {
42-
var str = source.source();
43-
return new CheapOriginalSource(str, module.resource);
44-
});
45-
} else {
46-
compilation.plugin("build-module", function(module) {
47-
module.useSourceMap = true;
48-
});
49-
}
38+
new SourceMapDevToolModuleOptionsPlugin(options).apply(compilation);
5039
compilation.plugin("after-optimize-chunk-assets", function(chunks) {
5140
var allModules = [];
5241
var allModuleFilenames = [];
@@ -64,11 +53,11 @@ SourceMapDevToolPlugin.prototype.apply = function(compiler) {
6453
return;
6554
}
6655
if(asset.sourceAndMap) {
67-
var sourceAndMap = asset.sourceAndMap();
56+
var sourceAndMap = asset.sourceAndMap(options);
6857
var sourceMap = sourceAndMap.map;
6958
var source = sourceAndMap.source;
7059
} else {
71-
var sourceMap = asset.map();
60+
var sourceMap = asset.map(options);
7261
var source = asset.source();
7362
}
7463
if(!sourceMap.sources)
@@ -126,7 +115,7 @@ SourceMapDevToolPlugin.prototype.apply = function(compiler) {
126115
var moduleFilenames = task.moduleFilenames;
127116
var modules = task.modules;
128117
sourceMap.sources = moduleFilenames;
129-
if(sourceMap.sourcesContent && !cheapMode) {
118+
if(sourceMap.sourcesContent) {
130119
sourceMap.sourcesContent = sourceMap.sourcesContent.map(function(content, i) {
131120
return content + "\n\n\n" + ModuleFilenameHelpers.createFooter(modules[i], requestShortener);
132121
});

lib/WebpackOptionsApply.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,13 @@ WebpackOptionsApply.prototype.process = function(options, compiler) {
185185
compiler.apply(new SourceMapDevToolPlugin(options.output.sourceMapFilename, "\n//# sourceMappingURL=[url]", options.output.devtoolModuleFilenameTemplate, options.output.devtoolFallbackModuleFilenameTemplate));
186186
else if(options.devtool === "#@sourcemap" || options.devtool === "#@source-map")
187187
compiler.apply(new SourceMapDevToolPlugin(options.output.sourceMapFilename, "\n/*\n//@ sourceMappingURL=[url]\n//# sourceMappingURL=[url]\n*/", options.output.devtoolModuleFilenameTemplate, options.output.devtoolFallbackModuleFilenameTemplate));
188+
else if(options.devtool === "cheapsourcemap" || options.devtool === "cheap-source-map")
189+
compiler.apply(new SourceMapDevToolPlugin({
190+
filename: options.output.sourceMapFilename,
191+
moduleFilenameTemplate: options.output.devtoolModuleFilenameTemplate,
192+
fallbackModuleFilenameTemplate: options.output.devtoolFallbackModuleFilenameTemplate,
193+
module: false, columns: false, lineToLine: options.output.devtoolLineToLine
194+
}));
188195
else if(options.devtool === "inlinesourcemap" ||
189196
options.devtool === "inline-sourcemap" ||
190197
options.devtool === "inline-source-map")
@@ -201,6 +208,12 @@ WebpackOptionsApply.prototype.process = function(options, compiler) {
201208
options.devtool === "#@inline-sourcemap" ||
202209
options.devtool === "#@inline-source-map")
203210
compiler.apply(new SourceMapDevToolPlugin(null, "\n/*\n//@ sourceMappingURL=[url]\n//# sourceMappingURL=[url]\n*/", options.output.devtoolModuleFilenameTemplate, options.output.devtoolFallbackModuleFilenameTemplate));
211+
else if(options.devtool === "cheapinlinesourcemap" || options.devtool === "cheap-inline-source-map")
212+
compiler.apply(new SourceMapDevToolPlugin({
213+
moduleFilenameTemplate: options.output.devtoolModuleFilenameTemplate,
214+
fallbackModuleFilenameTemplate: options.output.devtoolFallbackModuleFilenameTemplate,
215+
module: false, columns: false, lineToLine: options.output.devtoolLineToLine
216+
}));
204217
else if(options.devtool === "evalsourcemap" ||
205218
options.devtool === "eval-sourcemap" ||
206219
options.devtool === "eval-source-map")
@@ -217,6 +230,12 @@ WebpackOptionsApply.prototype.process = function(options, compiler) {
217230
options.devtool === "#@eval-sourcemap" ||
218231
options.devtool === "#@eval-source-map")
219232
compiler.apply(new EvalSourceMapDevToolPlugin("\n/*\n//@ sourceMappingURL=[url]\n//# sourceMappingURL=[url]\n*/", options.output.devtoolModuleFilenameTemplate));
233+
else if(options.devtool === "cheapevalsourcemap" || options.devtool === "cheap-eval-source-map")
234+
compiler.apply(new EvalSourceMapDevToolPlugin({
235+
moduleFilenameTemplate: options.output.devtoolModuleFilenameTemplate,
236+
fallbackModuleFilenameTemplate: options.output.devtoolFallbackModuleFilenameTemplate,
237+
module: false, columns: false, lineToLine: options.output.devtoolLineToLine
238+
}));
220239

221240
function itemToPlugin(item, name) {
222241
if(Array.isArray(item))

lib/WebpackOptionsDefaulter.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ function WebpackOptionsDefaulter() {
3838
this.set("output.hashDigest", "hex");
3939
this.set("output.hashDigestLength", 20);
4040
this.set("output.sourcePrefix", "\t");
41+
this.set("output.devtoolLineToLine", false);
4142

4243
this.set("node.console", false);
4344
this.set("node.process", true);

test/TestCases.test.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ describe("TestCases", function() {
2727
{ name: "devtool-eval-source-map", devtool: "#eval-source-map" },
2828
{ name: "devtool-inline-source-map", devtool: "inline-source-map" },
2929
{ name: "devtool-source-map", devtool: "#@source-map" },
30+
{ name: "devtool-cheap-inline-source-map", devtool: "cheap-inline-source-map" },
31+
{ name: "devtool-cheap-eval-source-map", devtool: "cheap-eval-source-map" },
32+
{ name: "devtool-cheap-source-map", devtool: "cheap-source-map" },
3033
{ name: "minimized", plugins: [
3134
new webpack.optimize.UglifyJsPlugin({
3235
sourceMap: false
@@ -128,4 +131,4 @@ describe("TestCases", function() {
128131
});
129132
});
130133
});
131-
});
134+
});

0 commit comments

Comments
 (0)