Сдвиг смещения во время 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' является ценным взломом для решения проблемы, но также может смещать зависимые исходные карты при слиянии, например.