2013-04-23 9 views
36

Rozważam przyjęcie browserify dla niektórych z moich projektów, ale chciałbym się upewnić, że inni nie będą musieli używać przeglądarki, jeśli będą chcieli użyć (w pakiecie) kod. Oczywistym sposobem na to jest zarówno ekspozycja eksportów modułów poprzez module.exports, jak i globalną window.. Wolę jednak nie zanieczyszczać globalnej przestrzeni nazw dla tych, którzy są require skryptem.Przeglądanie: W razie potrzeby użyj module.exports, w przeciwnym razie można wyeksponować globalne

Czy można wykryć, czy skrypt jest w postaci require d? Jeśli tak, to mógłby zrobić coś takiego:

var mymodule = (function() { ... })(); 
if (isRequired()) { 
    module.exports = mymodule; 
} else { 
    window.mymodule = mymodule; 
} 

Należy pamiętać, że bez względu na to co to będzie dołączonego wcześniej, więc nie będzie var mymodule narażając globalnym. Ponadto obecnie używam urządzenia revealing module pattern, ale wolałbym przejść na coś bardziej odpowiedniego do przeglądania w trybie przeglądania.

Jaki jest najlepszy sposób na sprawienie, aby moduł był w stanie i require w stanie istanie? Czy w obu przypadkach najlepiej jest ujawnić sytuację globalną?

Odpowiedz

2

Zakładając innej biblioteki nie stworzył globalny module.exports obiekt, można po prostu sprawdzić na istnienie module.exports

var mymodule = (function() { ... })(); 
if (module && module.exports) { 
    module.exports = mymodule; 
} else { 
    window.mymodule = mymodule; 
} 
+0

Przegrywanie sprawia, że ​​'module',' module.exports' i 'require' są dostępne dla wszystkich plików w pakiecie. Tak więc tylko moje łączenie się sprawia, że ​​są one dostępne. Dzięki za odpowiedzi. –

18

mam do czynienia z tym samym problemem budowy biblioteki i tu jest rought opinii. Myślę, że musimy oddzielić najpierw odbiorców dla biblioteki w kilku kategoriach:

  1. tych, którzy używają browserify i NPM
  2. tych, którzy po prostu pobrać mylib.min.js i używać w jedną stronę lub inna AMD (z altanką?) może być trzecią kategorią.

Więc dla jest to łatwe, trzeba będzie moduł twoi index.js:

module.exports = function() { /* code */ } 

a package.json będą miały główny

"główny": "index.js"

Uwaga Nie dodawałem żadnego kodu window.xx do pliku index.js.

Dla Myślę, że najlepszym pomysłem jest stworzenie standalone.js

var mylib = require('./index.js'); 
global.window.mylib = mylib; 

to co browserify należy budować.

Dla (jeśli ci na tym zależy) możesz zmienić ustawienie samodzielne.js następująco:

var mylib = require('./index.js'); 
if (typeof global.window.define == 'function' && global.window.define.amd) { 
    global.window.define('mylib', function() { return mylib; }); 
} else { 
    global.window.mylib = mylib; 
} 
0

Dlaczego nie po prostu owinąć całą rzecz zamknięciem i przekazać exports jako parametr?

(function (exports) { 
    // code here 
    // ... 
    exports.foo = bar; 
})(exports || this); 

W ten sposób zostanie również wyeksportowany do zakresu WebWorker i innych środowisk "bez okien".

Powiązane problemy