Сдвиг смещения во время eval (с использованием sourcemap)

Я загружаю script из файла, и я использую eval() для создания кода Javascript, подобного этому

var code = fs.readFileSync('myfile');
var shiftedCode= 'function(param) {' + code + '}\n'+ '//# sourceURL=myfile';
eval(shiftedCode)

Проблема заключается в том, когда я помещаю точку останова или отладчика внутри кода, он останавливает две строки после правильного из-за добавленных символов в начале, я полагаю.

Есть ли способ переместить sourceURL в правильную начальную точку, может быть, с помощью sourcemaps?

Заранее благодарим вас за помощь.

Ответ 1

Определение проблемы

Я вижу, что вы пытаетесь импортировать код Javascript с одной страницы на другую, и у вас возникли некоторые проблемы (вы определили один, и я определим еще один):

  • Проблема sourcemaps/debugger:
    • Первый, я не рекомендую создавать исходную карту во время выполнения. Такие инструменты, как Gulp, Grunt и Webpack, помогут вам в этих случаях использования и позволят вам сосредоточиться на бизнес-логике и уберечь вас от этих проблем.
    • Второй Подумайте о том, кто будет использовать этот код на другой странице. Считаете ли вы, что смена исходной карты будет хорошей? Это будет каждый сдвиг времени!
    • Возможное решение: Этот lib также может помочь вам в вашем случае использования. Сначала создайте новый код, затем запустите его.

var offsetLines = require('offset-sourcemap-lines');
var conv = require('convert-source-map');
var fs = require('fs');
var code = fs.readFileSync('myfile');
var originalMap = conv.fromSource(code).toObject();
var codeBody = conv.removeComments(code);
var offsettedMap = offsetLines(originalMap, 1); // One line to be shifted
var newSourceMapComment = conv.fromObject(offsettedMap).toComment();
var shiftedCode= 'function(param) {\n' + codeBody + '}\n' + newSourceMapComment;
eval(shiftedCode)

Ответ 2

вы можете использовать ниже пакет offset-sourcemap-lines

var offsetLines = require('offset-sourcemap-lines');
var conv = require('convert-source-map');
var fs = require('fs');

var codeWithSourceMapComment = fs.readFileSync('/path/to/code-with-sourcemap-comment.js', 'utf-8');
var originalMap = conv.fromSource(codeWithSourceMapComment).toObject();

var header = 'function(param) {' + code + '}\n';
var offset = header.match(/\n/g).length + 2; //you might need to work on this

var offsettedMap = offsetLines(originalMap, offset);

var codeBody = conv.removeComments(codeWithSourceMapComment);
var newSourceMapComment = conv.fromObject(offsettedMap).toComment();
console.log(header + codeBody + '\n' + newSourceMapComment);

Ответ 3

Как насчет этого решения. вместо запуска кода с помощью eval используйте Function constructor

myfile.js

var a = 123;
console.log(a, param1, param2);

loader.js

var code = fs.readFileSync('myfile.js');
var notShiftedCode = code + '\n//# sourceURL=myfile' 
var f = new Function('param1', 'param2', code2)

f(456,678)

Я проверил это на chrome devtool, и он выглядит очень nit (перейдите в функцию с F11)

Ответ 4

Я копаю в свойстве sourcemap 'sections. Из спецификации это может решить мою проблему, установив начальное смещение: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt

Но главная проблема заключается в том, что я не могу найти инструменты отладки с использованием этой спецификации: кажется, что она широко реализована или вообще не работает.

'offset-sourcemap-lines' является ценным взломом для решения проблемы, но также может смещать зависимые исходные карты при слиянии, например.