Подтвердить что ты не робот

Параметр 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?

4b9b3361

Ответ 1

Оказывается, что basedir не совпадает с RequireJS baseUrl. Как заявил @Ben в комментарии выше, официальные документы гласят:

opts.basedir - это каталог, в котором браузеру запущен пакет от для имен файлов, начинающихся с ..

(источник)

Значение basedir применимо только к файлам entry. Дальнейшие require вызовы в глубину структуры дерева файлов всегда будут разрешены относительно файла, который в настоящее время обрабатывается.

Отвечайте на мой вопрос

Опция paths browser-resolve (используемая browserify под капотом) - это то, что я искал:

paths - массив require.paths, если ничего не найдено в обычном node_modules рекурсивная прогулка

(источник)

Просто передайте этот параметр вместе с другими browserify опциями при создании экземпляра пакета.

Примечание: при использовании browserify-shim transform оно выглядит как испортить вещи.