Browserify basedir option (RequireJS-like)


Я не могу понять, как работает опция browserify basedir ..

Примечание : я могу ошибаться в своем понимании всей концепции basedir, потому что я исхожу из RequireJS (think baseUrl).

EDIT Действительно, я был неправ, но вы все еще можете достичь того, что я пытался сделать с помощью опции paths, см. Мой ответ ниже.

Я понимаю, что опция basedir дает вам возможность (свободу!) для указания всех требуемых путей (начиная с .) из статического корневого / базового реж.. И не от process.cwd()..

Это буквально сводит меня с ума, я думал, что такая функция будет настолько простой в реализации, и что многие люди столкнулись бы с той же проблемой, что и я, но на самом деле в интернете очень мало информации о том, как правильно настроить опцию basedir.. И поверьте мне, это не прямолинейно..

Итак, вот основной пример, который сводит меня с ума.

Дан следующий файл структура:

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 11

1 ответ:

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

opts.basedir является ли каталог, который browserify начинает связывать от для имен файлов, которые начинаются с ..

(Источник)

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

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

Вариант paths browser-resolve (который используется browserify под капотом) - это то, что я искал:

Пути-требуют.массив путей для использования, если ничего не найдено на нормальном node_modules рекурсивное блуждание

(Источник)

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

Примечание : похоже, что это путаница вещи при использовании вместе с browserify-shim преобразование .