Использование sourceURL и sourceMappingURL с относительными путями - PullRequest
1 голос
/ 14 июня 2019

Похоже, что sourceURL делается относительно по-разному в Firefox и Chrome - когда некоторые инструменты генерируют строки //# sourceURL=... в файлах JS, относящихся к файлу, в котором они размещены, Firefox обрабатывает URL-адрес относительно файла JS. в то время как Chrome вместо этого обрабатывает его как относительно исходного HTML-файла. Что является правильным, или есть более ясный способ заявить об этом?


В этом примере приложения я пытаюсь использовать sourceURL, чтобы разрешить объединение множества файлов меньшего размера в один большой файл, но при этом браузер знает, как должен называться файл меньшего размера, и sourceMappingURL затем указать файл исходной карты относительно этого исходного файла.

Структура каталогов:

index.html
js/
  all.js
  uncompiled/
    app.js
    app.js.map
    app.min.js

index.html - минимальная страница для загрузки js/all.js или js/uncompiled/app.min.js. Никакой другой JS не запекается в js/all.js (так как это минимальный пример), но в теории их здесь может быть много. Цель этого файла - просто объединить различные уменьшенные файлы JS в один больший файл, но при этом позволить разработчику увидеть исходный код и соответственно установить точки останова.

Содержимое app.js:

class App {

    constructor(name) {
        this.name = name;
    }

    sayHi() {
        window.alert("Hello " + this.name);
    }
}

new App("Colin").sayHi();

Затем, запустив простой минификатор, перестраивает его в app.min.js с соответствующим файлом app.js.map:

var App=function(a){this.name=a};App.prototype.sayHi=function(){window.alert("Hello "+this.name)};(new App("Colin")).sayHi();
//# sourceMappingURL=app.js.map
{
"version":3,
"file":"./app.min.js",
"lineCount":1,
"mappings":"AAAA,IAAMA,IAELC,QAAW,CAACC,CAAD,CAAO,CACjB,IAAAA,KAAA,CAAYA,CADK,CAIlB,IAAA,UAAA,MAAAC,CAAAA,QAAK,EAAG,CACPC,MAAAC,MAAA,CAAa,QAAb,CAAwB,IAAAH,KAAxB,CADO,CAKTC,EAAA,IAAIH,GAAJ,CAAQ,OAAR,CAAAG,OAAA;",
"sources":["app.js"],
"names":["App","constructor","name","sayHi","window","alert"]
}

И, наконец, этот минимизированный вывод обернут в eval, и в конец добавляется параметр sourceURL (разрывы строк добавляются для удобства чтения):

eval('var App=function(a){this.name=a};App.prototype.sayHi=function
(){window.alert("Hello "+this.name)};(new App("Colin")).sayHi();\n
//# sourceMappingURL=app.js.map\n//# sourceURL=uncompiled/app.min.js');

Если index.html прямо указывает на js/uncompiled/app.min.js, то и Firefox, и Chrome правильно понимают, что app.js.map находится в одном каталоге и должен использоваться при отладке. Однако, если index.html указывает вместо js/all.js, тогда, хотя оба браузера правильно отображают содержимое eval в отдельном файле, только Firefox делает путь относительно all.js.

Использование python -m http.server в этой структуре показывает следующие результаты в Firefox:

127.0.0.1 - - [14/Jun/2019 08:33:37] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [14/Jun/2019 08:33:37] "GET /js/all.js HTTP/1.1" 200 -
127.0.0.1 - - [14/Jun/2019 08:33:38] code 404, message File not found
127.0.0.1 - - [14/Jun/2019 08:33:38] "GET /favicon.ico HTTP/1.1" 404 -
127.0.0.1 - - [14/Jun/2019 08:33:41] "GET /js/uncompiled/app.js.map HTTP/1.1" 200 -
127.0.0.1 - - [14/Jun/2019 08:33:41] "GET /js/uncompiled/app.js HTTP/1.1" 200 -

С другой стороны, вот что пытается сделать Chrome:

127.0.0.1 - - [14/Jun/2019 08:34:22] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [14/Jun/2019 08:34:22] "GET /js/all.js HTTP/1.1" 200 -
127.0.0.1 - - [14/Jun/2019 08:34:22] code 404, message File not found
127.0.0.1 - - [14/Jun/2019 08:34:22] "GET /uncompiled/app.js.map HTTP/1.1" 404 -
127.0.0.1 - - [14/Jun/2019 08:34:23] code 404, message File not found
127.0.0.1 - - [14/Jun/2019 08:34:23] "GET /favicon.ico HTTP/1.1" 404 -

Похоже, что Chrome предполагает, что sourceURL в js/app.js относится к index.html, тогда как Firefox вместо этого (правильно, с моей точки зрения) интерпретирует его как относящийся к app.js. Я полагаю, что Firefox верен, так как это позволяет любому файлу HTML включать этот JS в любой путь, и при этом исходные карты по-прежнему загружаются правильно.

Примеры источников, включая два html-файла с разными относительными путями: https://github.com/niloc132/sourceurl-and-sourcemapping-url-relative-paths

1 Ответ

0 голосов
/ 14 июня 2019

Из спецификации (или копии в https://sourcemaps.info/spec.html):

Когда URL-адрес сопоставления источника не является абсолютным, он относится к «источнику источника» сгенерированного кода. Источник источника определяетсяв одном из следующих случаев:

  • Если сгенерированный источник не связан с элементом сценария, который имеет атрибут «src», и в сгенерированном коде существует комментарий //# sourceURL, этот комментарий долженбыть использованы для определения источника источника. Примечание: Ранее это было «// @ sourceURL», как и в случае «// @ sourceMappingURL», разумно принять оба, но предпочтительно // #.
  • Еслисгенерированный код связан с элементом script, а элемент script имеет атрибут «src», атрибут «src» элемента script будет источником источника.
  • Если сгенерированный код связан со скриптомэлемент и элемент script не имеют атрибута «src», тогда источником источника будет источник страницы.
  • Если генНоминальный код оценивается как строка с помощью функции eval() или с помощью new Function(), тогда источником источника будет источник страницы.

В случае js/all.js,это происходит в последнем случае: источник источника будет источником страницы.Таким образом, кажется, что Chrome следует спецификации, хотя это может показаться нелогичным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...