/ / Packaging up RequireJS модули "текст!" - knockout.js, requirejs, durandal, bundling-and-minification, r.js

Опаковане на модулите RequireJS "text!" - knockout.js, requjs, durandal, пакетиране и минимизиране, r.js

Опитвам се да разбера дали (и как, ако е възможно) да използваме Инструмент за оптимизиране на RequireJS да включи не само моите JavaScript модули, но и моя "текст!" модули. Работя върху приложение на Durandal, което използва модули "текст!" За изгледи.

Понякога имаме потребители, които получават време за изчакване за зареждане на изглед. Ето примерна грешка:

Error: Load timeout for modules: text!views/primaryapplicants.html
http://requirejs.org/docs/errors.html#timeout

Имам друг въпрос, който току-що написах за обработката на този таймаут, Не мога да разбера как да го прехванем и да опитам отново. Знам, че дефиницията на модула е валидна, просто клиентите могат да имат проблем с мрежовата свързаност - особено ако са на мобилен телефон.

Въпреки това, тъй като аз продължих да обмислям това, азосъзнайте, че ако мога просто да пакетирам цялото приложение в един файл, тогава бихме могли да избегнем допълнителните HTTP повиквания - които биха могли да намалят времето за изчакване като това. Това би означавало, че приложението или се зарежда, или пък не "t - вместо възможността за" частично "зареждане.

Това приложение няма голям брой изгледи. Предполагам, че добавянето на всеки изглед ще добави около 20kb с gzip компресия.

Така че, възможно ли е да се пакетират тези "текстове!" модули някак?

Отговори:

1 за отговор № 1

Налице е inlineText build config опция (вярно по подразбиране), което инструктира оптимизатора да направи точно това, което искате. Едно от предупрежденията е, че точно както при всеки друг модул, ще открива само зависимости, определени в някои модули define() блок. С други думи, няма да може да го открие text! зависимости, които се изискват при поискване, освен ако те не са достигнати изрично - и това е мястото, където е вашият проблем.

Едно решение (далеч от идеалното, ако имате много файлове за преглед) би било да се определи всеки отделен text! зависимост, която използвате в include опция вътре в конфигурационната ви конфигурация, например:

// ...
include: ["text!views/primaryapplicants.html",
"text!views/secondaryapplicants.html",
// etc.
]
// ...

1 за отговор № 2

Може би искате да опитате оптимизатора на weyland, Durandal. Примерна конфигурация на weyland-config.js може да бъде намерена в HTML StarterKit.

https://github.com/BlueSpire/Durandal/blob/master/platforms/HTML/StarterKit/weyland-config.js

exports.config = function(weyland) {
weyland.build("main")
.task.jshint({
include:"app/**/*.js"
})
.task.uglifyjs({
include:["app/**/*.js", "lib/durandal/**/*.js"]
})
.task.rjs({
include:["app/**/*.{js,html}", "lib/durandal/**/*.js"],
loaderPluginExtensionMaps:{
".html":"text"
},
rjs:{
name:"../lib/require/almond-custom", //to deploy with require.js, use the build"s name here instead
insertRequire:["main"], //not needed for require
baseUrl : "app",
wrap:true, //not needed for require
paths : {
"text": "../lib/require/text",
"durandal":"../lib/durandal/js",
"plugins" : "../lib/durandal/js/plugins",
"transitions" : "../lib/durandal/js/transitions",
"knockout": "../lib/knockout/knockout-2.3.0",
"bootstrap": "../lib/bootstrap/js/bootstrap",
"jquery": "../lib/jquery/jquery-1.9.1"
},
inlineText: true,
optimize : "none",
pragmas: {
build: true
},
stubModules : ["text"],
keepBuildDir: true,
out:"app/main-built.js"
}
});
}