Pytanie Opcji Browserify basedir (RequireJS-like)


Nie mogę wymyślić, jak browserify basedir opcja Prace..

Uwaga: Mogę się mylić w moim rozumieniu całości basedir koncepcja, ponieważ pochodzę z RequireJS (myślę baseUrl).

EDYTOWAĆ Rzeczywiście się myliłem, ale nadal możesz osiągnąć to, co próbowałem zrobić z tym paths opcję, zobacz moją odpowiedź poniżej.

Rozumiem, że basedir opcja daje możliwość (wolność!), aby określić wszystkie wymagane ścieżki (zaczynając od a .) ze statycznego katalogu głównego / bazowego. A NIE z process.cwd()..

To dosłownie doprowadza mnie do szału, chociaż taka funkcja byłaby tak podstawowa do wdrożenia i że wiele osób wpadłoby na ten sam problem co ja, ale w sieci jest bardzo mało informacji o tym, jak poprawnie skonfigurować basedir opcja .. I uwierz mi, to nie jest proste ...

Oto BASIC przykład, który doprowadza mnie do szału.

Biorąc pod uwagę następującą strukturę plików:

js/
js/app.js
js/src/models/Person.js
js/src/views/PersonView.js

I bieganie:

var browserify = require('browserify');
var gulp = require('gulp');

gulp.task('scripts', function() {

  var b = browserify('./app', {basedir: './js'});

  b.bundle().pipe(gulp.dest('./dist'));
});

Spodziewałbym się, że będę mógł wykonać następujące czynności require() przywołać PersonView.js:

var Person = require('./src/models/Person');
...

Zamiast (co oczywiście działa ...):

var Person = require('../models/Person');
...

Ale pojawia się następujący błąd:

Error: module "./src/models/Person" not found from "/Users/...some path.../js/src/views/PersonView.js"

Czego mi brakuje w tym basedir opcja?


11
2018-03-16 08:06


pochodzenie


Z dokumentacji wygląda to jak basedir wpływa tylko na ścieżki, które przechodzą browserify zainicjować proces pakowania (w twoim przypadku ścieżkę do app.js). Ścieżki, których używasz require() pozostaną w stosunku do plików, w których występują. - Ben
Tak, thx, właśnie to zakończyłem zrozumieniem. The paths opcja browser-resolve jest to, czego szukałem. - eightyfive


Odpowiedzi:


Okazało się, że basedir nie jest tym samym, co RequireJS baseUrl. Jak stwierdził @Ben w powyższym komentarzu, oficjalni doktorzy mówią:

opts.basedir jest katalogiem, który przegląda rozpoczyna łączenie   od dla nazw plików zaczynających się od ..

(źródło)

To znaczy basedir dotyczy tylko entry akta. Dalej require wywołania głęboko w strukturze drzewa plików zawsze będą rozwiązywane relatywnie do aktualnie analizowanego pliku.

Odpowiedz na moje pytanie

The paths opcja browser-resolve (który jest używany przez browserify pod maską) to, czego szukałem:

paths - wymagają tablicy array.paths, jeśli nic nie zostanie znalezione w normalnym trybie   node_modules spacer rekurencyjny

(źródło)

Po prostu przekaż tę opcję razem z innymi browserify opcje podczas tworzenia instancji bundler.

Uwaga: Wygląda na to zepsuć rzeczy podczas używania razem z browserify-shim przekształcać.


9
2018-03-24 05:31



Może Cię zainteresować ten temat: stackoverflow.com/a/23608416/82609 - Sebastien Lorber