2013-03-17 11 views
16

Chcę użyć Browserify do pakowania moich plików, ale muszę wtedy wymagać jednego z modułów wewnątrz mojej przeglądarki Browserify w pakiecie bundle.js na samej stronie HTML. Obecnie nie jest to możliwe, ponieważ na stronie nie ma zdefiniowanej funkcji require.Globalne wymagają z Browserify v2

Wygląda na to, że funkcjazdefiniowana przez przeglądnięcie w bundle.js jest wewnątrz IIFE, więc nie mogę jej użyć. Czy jest możliwe wyrzucenie tego w miejsce globalnego require?

<script src="bundle.js"></script> 
<script> 
    // Require the `app` module inside of `bundle.js` 
    var app = require('app'); 
    app.start(); 
</script> 

muszę to zrobić, bo mój app.start funkcja wymaga niektóre JSON jest przekazywana do niego, które mogą być świadczone tylko przez szablon po stronie serwera.

N.B. Używam przeglądarki Browserify v2.

Odpowiedz

32

Można użyć -r do expose a global require() funkcji dla plików należy podać:

x.js:

module.exports = function (n) { return n * 111 } 

konsolę

$ browserify -r ./x.js > bundle.js 

następnie w HTML:

<script src="bundle.js"></script> 
<script> 
    var x = require('./x.js'); 
    console.log(x(3)) 
</script> 

wydrukuje 333.

W twoim przypadku po prostu wykonaj browserify -r app, aby wystawić require('app') na kontekst zewnętrzny.

+2

Dzięki za to. Co dziwne, jeśli przekażesz względny adres URL, taki jak "x.js" zamiast "./X.js", spowoduje to błąd z 'TypeError: Not a string lub buffer' –

+0

Musisz podać ścieżkę dokładnie, ponieważ rozdzielczość modułu dzieje się w czas pakietu. W pakietach klienckich nie ma już algorytmu rozwiązania modułu w wersji 2. – substack

+0

Chciałbym, aby metoda require została dołączona do globalnej zwrócony z wbudowanego modułu, dając mi hermetyzację. Coś w rodzaju '' bundle.require ('./ x.js') '' '. Zrobiłem to poprzez stworzenie manifestu wymagań w moim głównym pliku. Czy jest lepszy sposób to zrobić? –