Разрешить относительный путь к абсолютному URL-адресу из модуля ES6 (в браузере)

Как разрешить относительный путь к абсолютному URL-адресу в модуле ES6 (в браузере)?

Например :

base-url.com/
    |-resolve
    |   |-resolveUrl.js
    |-dir
        |-dir1
            |-module1.js
        |-dir2
            |-module2.js

module1.js

import resolveUrl from "../../../resolve/resolveUrl.js"
resolveUrl("../dir2/module2.js") // return 'base-url.com/dir/dir2/module2.js'

Какой была бы реализация resolveUrl?

base-url.com/ не может быть доменом веб-сайта. Это может быть репо, где хранятся только источники.


person Yairopro    schedule 07.02.2018    source источник
comment
Есть ли намерение запустить этот код в браузере или в среде NodeJS?   -  person bsinky    schedule 08.02.2018
comment
@bsinky В браузере. знак равно   -  person Yairopro    schedule 08.02.2018
comment
@PatrickRoberts цитаты? ...?   -  person Yairopro    schedule 08.02.2018
comment
@ jfriend00, который не является дубликатом, ваша ссылка предполагает, что есть явная ссылка на абсолютный путь, с которого следует начинать, здесь это не так.   -  person Patrick Roberts    schedule 08.02.2018
comment
@PatrickRoberts - в браузере абсолютная ссылка - это путь к странице. Нет доступа к файлам из Javascript, поэтому, если вы действительно спрашиваете о браузере, вы, должно быть, говорите об относительных URL-адресах, верно? Если нет, то уточните, пожалуйста, свой вопрос. И для URL-адресов в браузере посмотрите второй ответ и объект URL(). Вопрос, кстати, кажется идентичным твоему. Возможно, вы реагируете на принятый ответ, в котором вас просят передать базовый путь (который не был частью вопроса), но есть и другие ответы, которые не требуют прохождения базового пути. По-моему, это чистый дурак.   -  person jfriend00    schedule 08.02.2018
comment
@ jfriend00 этот вопрос касается разрешения URL-адреса относительно пути экспериментального модуля, вызывающего функцию. Я подозреваю, что может быть решение, связанное с document.currentScript.src, хотя я не могу подтвердить это, так как у меня нет простого способа проверить. Но это точно не дубликат.   -  person Patrick Roberts    schedule 08.02.2018
comment
@PatrickRoberts - Конечно, вопрос в этом отношении для меня не очень ясен. Во всяком случае, я снова открылся.   -  person jfriend00    schedule 08.02.2018
comment
@Yairopro Я пытался сделать тест, но не могу из-за CORS. Я думаю, что более многообещающий подход включает взлом, создающий объект ошибки в ResolveUrl() и проверку его свойства stack на предмет ссылки на базовый URL-адрес вызывающего модуля. Надеюсь, это поможет.   -  person Patrick Roberts    schedule 08.02.2018
comment
Я также нашел this, который может сделать этот подход более надежным за счет использования Error.captureStackTrace().   -  person Patrick Roberts    schedule 08.02.2018
comment
@PatrickRoberts Большое спасибо за то, что помогли мне оставить этот вопрос открытым. Использование document.currentScript.src не помогает, потому что при выполнении из файлов модуля js document.currentScript равно undefined (известно из теста). Кроме того, мне очень нравится ваш подход к использованию стека вызовов. Что касается библиотеки error-polyfill, я не нашел способа запустить ее в браузере. Он говорит, что это возможно в read-me, но мне не удалось, так как он использует функцию require ..   -  person Yairopro    schedule 08.02.2018
comment
@Yairopro вам нужно преобразовать его, используя что-то вроде webpack или browserify. Это очень сложно, но далеко не невозможно.   -  person Patrick Roberts    schedule 08.02.2018
comment
@PatrickRoberts решил. Спасибо за ваш совет. Я предпочел использовать stacktrace.js, поскольку это рекомендуемая библиотека от MDN   -  person Yairopro    schedule 08.02.2018


Ответы (1)


???? Теперь вы можете использовать to-absolute-url.

Он использует stacktrace.js под капотами, чтобы получить файл абсолютного пути вызывающей функции:

Спасибо @PatrickRoberts за его идею использовать stacktrace и @ jfriend00 за совет по использованию объекта URL.

person Yairopro    schedule 08.02.2018