版博士V2.0程序
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. # @jridgewell/trace-mapping
  2. > Trace the original position through a source map
  3. `trace-mapping` allows you to take the line and column of an output file and trace it to the
  4. original location in the source file through a source map.
  5. You may already be familiar with the [`source-map`][source-map] package's `SourceMapConsumer`. This
  6. provides the same `originalPositionFor` and `generatedPositionFor` API, without requiring WASM.
  7. ## Installation
  8. ```sh
  9. npm install @jridgewell/trace-mapping
  10. ```
  11. ## Usage
  12. ```typescript
  13. import {
  14. TraceMap,
  15. originalPositionFor,
  16. generatedPositionFor,
  17. sourceContentFor,
  18. } from '@jridgewell/trace-mapping';
  19. const tracer = new TraceMap({
  20. version: 3,
  21. sources: ['input.js'],
  22. sourcesContent: ['content of input.js'],
  23. names: ['foo'],
  24. mappings: 'KAyCIA',
  25. });
  26. // Lines start at line 1, columns at column 0.
  27. const traced = originalPositionFor(tracer, { line: 1, column: 5 });
  28. assert.deepEqual(traced, {
  29. source: 'input.js',
  30. line: 42,
  31. column: 4,
  32. name: 'foo',
  33. });
  34. const content = sourceContentFor(tracer, traced.source);
  35. assert.strictEqual(content, 'content for input.js');
  36. const generated = generatedPositionFor(tracer, {
  37. source: 'input.js',
  38. line: 42,
  39. column: 4,
  40. });
  41. assert.deepEqual(generated, {
  42. line: 1,
  43. column: 5,
  44. });
  45. ```
  46. We also provide a lower level API to get the actual segment that matches our line and column. Unlike
  47. `originalPositionFor`, `traceSegment` uses a 0-base for `line`:
  48. ```typescript
  49. import { traceSegment } from '@jridgewell/trace-mapping';
  50. // line is 0-base.
  51. const traced = traceSegment(tracer, /* line */ 0, /* column */ 5);
  52. // Segments are [outputColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]
  53. // Again, line is 0-base and so is sourceLine
  54. assert.deepEqual(traced, [5, 0, 41, 4, 0]);
  55. ```
  56. ### SectionedSourceMaps
  57. The sourcemap spec defines a special `sections` field that's designed to handle concatenation of
  58. output code with associated sourcemaps. This type of sourcemap is rarely used (no major build tool
  59. produces it), but if you are hand coding a concatenation you may need it. We provide an `AnyMap`
  60. helper that can receive either a regular sourcemap or a `SectionedSourceMap` and returns a
  61. `TraceMap` instance:
  62. ```typescript
  63. import { AnyMap } from '@jridgewell/trace-mapping';
  64. const fooOutput = 'foo';
  65. const barOutput = 'bar';
  66. const output = [fooOutput, barOutput].join('\n');
  67. const sectioned = new AnyMap({
  68. version: 3,
  69. sections: [
  70. {
  71. // 0-base line and column
  72. offset: { line: 0, column: 0 },
  73. // fooOutput's sourcemap
  74. map: {
  75. version: 3,
  76. sources: ['foo.js'],
  77. names: ['foo'],
  78. mappings: 'AAAAA',
  79. },
  80. },
  81. {
  82. // barOutput's sourcemap will not affect the first line, only the second
  83. offset: { line: 1, column: 0 },
  84. map: {
  85. version: 3,
  86. sources: ['bar.js'],
  87. names: ['bar'],
  88. mappings: 'AAAAA',
  89. },
  90. },
  91. ],
  92. });
  93. const traced = originalPositionFor(sectioned, {
  94. line: 2,
  95. column: 0,
  96. });
  97. assert.deepEqual(traced, {
  98. source: 'bar.js',
  99. line: 1,
  100. column: 0,
  101. name: 'bar',
  102. });
  103. ```
  104. ## Benchmarks
  105. ```
  106. node v18.0.0
  107. amp.js.map - 45120 segments
  108. Memory Usage:
  109. trace-mapping decoded 562400 bytes
  110. trace-mapping encoded 5706544 bytes
  111. source-map-js 10717664 bytes
  112. source-map-0.6.1 17446384 bytes
  113. source-map-0.8.0 9701757 bytes
  114. Smallest memory usage is trace-mapping decoded
  115. Init speed:
  116. trace-mapping: decoded JSON input x 180 ops/sec ±0.34% (85 runs sampled)
  117. trace-mapping: encoded JSON input x 364 ops/sec ±1.77% (89 runs sampled)
  118. trace-mapping: decoded Object input x 3,116 ops/sec ±0.50% (96 runs sampled)
  119. trace-mapping: encoded Object input x 410 ops/sec ±2.62% (85 runs sampled)
  120. source-map-js: encoded Object input x 84.23 ops/sec ±0.91% (73 runs sampled)
  121. source-map-0.6.1: encoded Object input x 37.21 ops/sec ±2.08% (51 runs sampled)
  122. Fastest is trace-mapping: decoded Object input
  123. Trace speed:
  124. trace-mapping: decoded originalPositionFor x 3,952,212 ops/sec ±0.17% (98 runs sampled)
  125. trace-mapping: encoded originalPositionFor x 3,487,468 ops/sec ±1.58% (90 runs sampled)
  126. source-map-js: encoded originalPositionFor x 827,730 ops/sec ±0.78% (97 runs sampled)
  127. source-map-0.6.1: encoded originalPositionFor x 748,991 ops/sec ±0.53% (94 runs sampled)
  128. source-map-0.8.0: encoded originalPositionFor x 2,532,894 ops/sec ±0.57% (95 runs sampled)
  129. Fastest is trace-mapping: decoded originalPositionFor
  130. ***
  131. babel.min.js.map - 347793 segments
  132. Memory Usage:
  133. trace-mapping decoded 89832 bytes
  134. trace-mapping encoded 35474640 bytes
  135. source-map-js 51257176 bytes
  136. source-map-0.6.1 63515664 bytes
  137. source-map-0.8.0 42933752 bytes
  138. Smallest memory usage is trace-mapping decoded
  139. Init speed:
  140. trace-mapping: decoded JSON input x 15.41 ops/sec ±8.65% (34 runs sampled)
  141. trace-mapping: encoded JSON input x 28.20 ops/sec ±12.87% (42 runs sampled)
  142. trace-mapping: decoded Object input x 964 ops/sec ±0.36% (99 runs sampled)
  143. trace-mapping: encoded Object input x 31.77 ops/sec ±13.79% (45 runs sampled)
  144. source-map-js: encoded Object input x 6.45 ops/sec ±5.16% (21 runs sampled)
  145. source-map-0.6.1: encoded Object input x 4.07 ops/sec ±5.24% (15 runs sampled)
  146. Fastest is trace-mapping: decoded Object input
  147. Trace speed:
  148. trace-mapping: decoded originalPositionFor x 7,183,038 ops/sec ±0.58% (95 runs sampled)
  149. trace-mapping: encoded originalPositionFor x 5,192,185 ops/sec ±0.41% (100 runs sampled)
  150. source-map-js: encoded originalPositionFor x 4,259,489 ops/sec ±0.79% (94 runs sampled)
  151. source-map-0.6.1: encoded originalPositionFor x 3,742,629 ops/sec ±0.71% (95 runs sampled)
  152. source-map-0.8.0: encoded originalPositionFor x 6,270,211 ops/sec ±0.64% (94 runs sampled)
  153. Fastest is trace-mapping: decoded originalPositionFor
  154. ***
  155. preact.js.map - 1992 segments
  156. Memory Usage:
  157. trace-mapping decoded 37128 bytes
  158. trace-mapping encoded 247280 bytes
  159. source-map-js 1143536 bytes
  160. source-map-0.6.1 1290992 bytes
  161. source-map-0.8.0 96544 bytes
  162. Smallest memory usage is trace-mapping decoded
  163. Init speed:
  164. trace-mapping: decoded JSON input x 3,483 ops/sec ±0.30% (98 runs sampled)
  165. trace-mapping: encoded JSON input x 6,092 ops/sec ±0.18% (97 runs sampled)
  166. trace-mapping: decoded Object input x 249,076 ops/sec ±0.24% (98 runs sampled)
  167. trace-mapping: encoded Object input x 14,555 ops/sec ±0.48% (100 runs sampled)
  168. source-map-js: encoded Object input x 2,447 ops/sec ±0.36% (99 runs sampled)
  169. source-map-0.6.1: encoded Object input x 1,201 ops/sec ±0.57% (96 runs sampled)
  170. Fastest is trace-mapping: decoded Object input
  171. Trace speed:
  172. trace-mapping: decoded originalPositionFor x 7,620,192 ops/sec ±0.09% (99 runs sampled)
  173. trace-mapping: encoded originalPositionFor x 6,872,554 ops/sec ±0.30% (97 runs sampled)
  174. source-map-js: encoded originalPositionFor x 2,489,570 ops/sec ±0.35% (94 runs sampled)
  175. source-map-0.6.1: encoded originalPositionFor x 1,698,633 ops/sec ±0.28% (98 runs sampled)
  176. source-map-0.8.0: encoded originalPositionFor x 4,015,644 ops/sec ±0.22% (98 runs sampled)
  177. Fastest is trace-mapping: decoded originalPositionFor
  178. ***
  179. react.js.map - 5726 segments
  180. Memory Usage:
  181. trace-mapping decoded 16176 bytes
  182. trace-mapping encoded 681552 bytes
  183. source-map-js 2418352 bytes
  184. source-map-0.6.1 2443672 bytes
  185. source-map-0.8.0 111768 bytes
  186. Smallest memory usage is trace-mapping decoded
  187. Init speed:
  188. trace-mapping: decoded JSON input x 1,720 ops/sec ±0.34% (98 runs sampled)
  189. trace-mapping: encoded JSON input x 4,406 ops/sec ±0.35% (100 runs sampled)
  190. trace-mapping: decoded Object input x 92,122 ops/sec ±0.10% (99 runs sampled)
  191. trace-mapping: encoded Object input x 5,385 ops/sec ±0.37% (99 runs sampled)
  192. source-map-js: encoded Object input x 794 ops/sec ±0.40% (98 runs sampled)
  193. source-map-0.6.1: encoded Object input x 416 ops/sec ±0.54% (91 runs sampled)
  194. Fastest is trace-mapping: decoded Object input
  195. Trace speed:
  196. trace-mapping: decoded originalPositionFor x 32,759,519 ops/sec ±0.33% (100 runs sampled)
  197. trace-mapping: encoded originalPositionFor x 31,116,306 ops/sec ±0.33% (97 runs sampled)
  198. source-map-js: encoded originalPositionFor x 17,458,435 ops/sec ±0.44% (97 runs sampled)
  199. source-map-0.6.1: encoded originalPositionFor x 12,687,097 ops/sec ±0.43% (95 runs sampled)
  200. source-map-0.8.0: encoded originalPositionFor x 23,538,275 ops/sec ±0.38% (95 runs sampled)
  201. Fastest is trace-mapping: decoded originalPositionFor
  202. ```
  203. [source-map]: https://www.npmjs.com/package/source-map