2014-10-17 17 views
13

Próbuję require plik z browserify wykorzystaniem zmiennych przekazanych do funkcji:Wymagaj w browserify nie działa zmienna nazwa

var playersOptions = { 
    name: 'players', 
    ajax: 'team-overview', 
    route: { 
     name: 'overview', 
     path: 'playersOverview', 
     url: 'playersoverview' 
    } 
}; 

var BackboneView = require(playersOptions.route.path); 
//Error: Uncaught Error: Cannot find module 'playersOverview' 

var BackboneView = require('playersOverview'); 
//Requires the file without any problems. 

Jestem zdezorientowany, dlaczego miałoby to nie? Jak nie można znaleźć modułu, gdy oba są łańcuchami?

Odpowiedz

18

Proces przeglądania musi być w stanie statycznie analizować wszystkie instrukcje wymagające w czasie kompilacji, aby mógł wiedzieć, jakie pliki musi zawierać w pakiecie. Wymaga to, aby require można było używać tylko z literałem tekstowym w kodzie źródłowym.

Zamiast przekazując nazwę modułu wokół wymagać później, po prostu przekazać sam moduł.

var playersOptions = { 
    name: 'players', 
    ajax: 'team-overview', 
    route: { 
     name: 'overview', 
     module: require('playersOverview'), 
     url: 'playersoverview' 
    } 
}; 

var BackboneView = playersOptions.route.module; 

Nawet jeśli to ograniczenie Browserify nie była obecna (np jeśli uzywasz node.js bezpośrednio), nadal dobrze jest unikać przekazywania nazw modułów, które będą wymagane później, ponieważ wymagające wywołanie może się zepsuć, jeśli przekazana do niego nazwa modułu ma ścieżkę w stosunku do katalogu dzwoniącego i została przekazana do kodu w pliku w innym katalogu.

+0

Arghhh ty krwawy geniuszu !!! To jest fantastyczne! 'Logika' :) –

Powiązane problemy