create better debuggable source maps

Summary:
Introduces a new mechanism to build source maps that allows us to use real mapping segments instead of just mapping line-by-line.

This mechanism is only used when building development bundles to improve the debugging experience in Chrome.

The new mechanism takes advantage of a new feature in babel-generator that exposes raw mapping objects. These raw mapping objects are converted to arrays with 2, 4, or 5 for the most compact representation possible.
We no longer generate a source map for the bundle that maps each line to itself in conjunction with configuring babel generator to retain lines.

Instead, we create a source map with a large mappings object produced from the mappings of each individual file in conjunction with a “carry over” – the number of preceding lines in the bundle.

The implementation makes a couple of assumptions that hold true for babel transform results, e.g. mappings being in the order of the generated code, and that a block of mappings always belongs to the same source file. In addition, the implementation avoids allocation of objects and strings at all costs. All calculations are purely numeric, and base64 vlq produces numeric ascii character codes. These are written to a preallocated buffer objects, which is turned to a string only at the end of the building process. This implementation is ~5x faster than using the source-map library.

In addition to providing development source maps that work better, we can now also produce individual high-quality source maps for production builds and combine them to an “index source map”. This approach is unfeasable for development source maps, because index source map consistently crash Chrome.

Better production source maps are useful to get precise information about source location and symbol names when symbolicating stack traces from crashes in production.

Reviewed By: jeanlauliac

Differential Revision: D4382290

fbshipit-source-id: 365a176fa142729d0a4cef43edeb81084361e54d
This commit is contained in:
David Aurelio
2017-01-12 14:21:59 -08:00
committed by Facebook Github Bot
parent 4969f26252
commit 0849f84df2
20 changed files with 181 additions and 436 deletions

View File

@@ -87,7 +87,7 @@ type __TransformOptions = {
type _TransformOptions =
__TransformOptions & {env?: {[key: string]: __TransformOptions}};
declare class _Ast {};
declare class _Ast {}
type TransformResult = {
ast: _Ast,
code: ?string,
@@ -119,9 +119,17 @@ declare module 'babel-core' {
): TransformResult;
}
type RawMapping = {
generated: {column: number, line: number},
name?: string,
original?: {column: number, line: number},
source?: string,
};
declare module 'babel-generator' {
declare type RawMapping = RawMapping;
declare function exports(
ast: _Ast,
options?: GeneratorOptions,
): TransformResult;
): TransformResult & {rawMappings: ?Array<RawMapping>};
}