Параметр Browserify basedir (RequireJS-like)
Я не могу понять, как работает браузерный вариант basedir
.
Примечание. Возможно, я ошибаюсь в своем понимании всей концепции basedir
, потому что я исхожу из RequireJS (думаю baseUrl
).
ИЗМЕНИТЬ
В самом деле, я был не прав, но вы все равно можете достичь того, что я пытался сделать с опцией paths
, см. Мой ответ ниже.
Я понимаю, что опция basedir
дает вам возможность (свобода!) указать все требуемые пути (начиная с .
) из статического корня/базового каталога.. И НЕ от process.cwd()
.
Это буквально заставляет меня сходить с ума, хотя такая функция была бы настолько базовой для реализации и что многие люди столкнулись бы с той же проблемой, что и я, но на самом деле очень мало информации в Интернете о том, как правильно настройте опцию basedir
.. И поверьте мне, это не прямолинейно..
Итак, вот пример BASIC, который сводит меня с ума.
Учитывая следующую структуру файла:
js/
js/app.js
js/src/models/Person.js
js/src/views/PersonView.js
И работает:
var browserify = require('browserify');
var gulp = require('gulp');
gulp.task('scripts', function() {
var b = browserify('./app', {basedir: './js'});
b.bundle().pipe(gulp.dest('./dist'));
});
Я ожидаю, что смогу выполнить следующий вызов require()
в PersonView.js
:
var Person = require('./src/models/Person');
...
Вместо (который явно работает...):
var Person = require('../models/Person');
...
Но я получаю следующую ошибку:
Error: module "./src/models/Person" not found from "/Users/...some path.../js/src/views/PersonView.js"
Что мне не хватает в опции basedir
?
Ответы
Ответ 1
Оказывается, что basedir
не совпадает с RequireJS baseUrl
. Как заявил @Ben в комментарии выше, официальные документы гласят:
opts.basedir
- это каталог, в котором браузеру запущен пакет от для имен файлов, начинающихся с .
.
(источник)
Значение basedir
применимо только к файлам entry
. Дальнейшие require
вызовы в глубину структуры дерева файлов всегда будут разрешены относительно файла, который в настоящее время обрабатывается.
Отвечайте на мой вопрос
Опция paths
browser-resolve
(используемая browserify
под капотом) - это то, что я искал:
paths - массив require.paths, если ничего не найдено в обычном node_modules рекурсивная прогулка
(источник)
Просто передайте этот параметр вместе с другими browserify
опциями при создании экземпляра пакета.
Примечание: при использовании browserify-shim
transform оно выглядит как испортить вещи.