2012-04-17 5 views
20

tl; dr: Jak zachować wtyczkę text.js z mojego zoptymalizowanego pliku, gdy wszystkie zależności tekstowe są włączone?W jaki sposób można zapobiec optymalizowaniu przez Require.js optymalizatora plików wtyczek tekstowych?

Używam Require.js optimizer (przez węzeł) do optymalizacji niektórych plików JS w moim projekcie. Używam text plugin do ładowania zależności tekstowych (szablony HTML, CSS). Mam moduł Chcę optymalizacji, w tym jego zależności, na przykład:

define(['text!core/core.css'], function(styles) { 
    // do setup stuff, return an object 
}); 

W Require.js docs powiedzieć, że plik core/core.css będą wstawiane kiedy uruchomić r.js Optimizer, który jestem powołując tak:

$ r.js -o baseUrl=./src name=core out=release/test.js 

Tracing dependencies for: core 
Uglifying file: c:/path/release/test.js 

c:/path/release/test.js 
---------------- 
c:/path/src/text.js 
text!core/core.css 
c:/path/src/core.js 

Dobra wiadomość jest taka, że ​​to działa. Kiedy patrzę na zoptymalizowanego pliku, widzę inlined tekst, coś takiego:

define("text!core/core.css",[],function(){return"some CSS text"}), 
define("core",["text!core/core.css"],function(a){ ... }) 

Złą wiadomością jest to, że wtyczka text.js jest również - dodaje o 3K, i składa się z (jak o ile mogę to stwierdzić) teraz całkowicie niepotrzebny kod do ładowania zewnętrznych plików tekstowych. Wiem, że 3K to niewiele, ale staram się, aby mój kod był wysoce zoptymalizowany i o ile rozumiem, kod dla wtyczki tekstowej nie jest wcale konieczny, jeśli moje zależności tekstowe są wbudowane. Mogę zachować wtyczkę do tekstu, dodając exclude=text do mojego połączenia , ale jeśli to zrobię, pojawia się błąd, gdy próbuję użyć zoptymalizowanego kodu w przeglądarce, mówiąc, że wtyczka text.js nie mogła zostać załadowana.

Więc:

  1. Czy jest jakiś powód plugin text.js jest faktycznie wymagane tutaj?

  2. Jeśli nie, to istnieje opcja konfiguracja dla r.js które mogą rozwiązać ten problem, albo

  3. Czy istnieje łatwy podkładka dla text.js plugin, że mogę to przekonać Wymagaj. js, że niepotrzebna wtyczka jest załadowana?

Odpowiedz

15

Wtyczka tekst jest naprawdę konieczne, ponieważ RequireJS musi sprawdzić, czy wtyczka implementuje metodę normalize przed pobraniem odpowiedniego modułu ID.

Sposobem na usunięcie wtyczki tekstowej z kompilacji jest użycie ustawienia onBuildWrite aby utworzyć pusty moduł wtyczki jak opisano na ten komentarz problem: https://github.com/jrburke/r.js/issues/116#issuecomment-4185237 - funkcja ta powinna wylądować na przyszłej wersji r.js

Edit:

r.js mają teraz ustawienie nazywa stubModules że robi dokładnie to:

//Specify modules to stub out in the optimized file. The optimizer will 
//use the source version of these modules for dependency tracing and for 
//plugin use, but when writing the text into an optimized layer, these 
//modules will get the following text instead: 
//If the module is used as a plugin: 
// define({load: function(id){throw new Error("Dynamic load not allowed: " + id);}}); 
//If just a plain module: 
// define({}); 
//This is useful particularly for plugins that inline all their resources 
//and use the default module resolution behavior (do *not* implement the 
//normalize() method). In those cases, an AMD loader just needs to know 
//that the module has a definition. These small stubs can be used instead of 
//including the full source for a plugin. 
stubModules : ['text'] 

Dla większej r.js op Sprawdź plik example.build.js.

+0

OK, dziękuję - spróbuję tego.Zasadniczo odpowiedzią jest (3) wykonanie podkładki, którą mogę opracować w moim procesie kompilacji. – nrabinowitz

+1

Dla potomności - zrobiłem shim w następujący sposób: 'define (" text ", {load: function() {}});' i dołączono go do początku mojego zoptymalizowanego pliku. Wydaje się działać dobrze – nrabinowitz

+1

Zastanawiam się, to samo. 'stubModules: ['text']' robi sztuczkę w nowszych wersjach RequireJS. – superlukas

Powiązane problemy