2015-03-08 2 views
4

Мы создаем приложение с Durandal, которое сейчас довольно велико, и в настоящее время мы изучаем объединение всех JS-файлов, находящихся в папке App, в файл main-built.js. Довольно простой и обычный материал, я думаю.Оптимизация Durandal с Gulp и Gulp-Durandal не работает

Я использую Gulp с расширением Gulp-Durandal. Вот наш gulpfile:

var gulp = require('gulp'); 
var durandal = require('gulp-durandal'); 

gulp.task('build-portal', function() { 
    durandal({ 
     baseDir: 'app', 
     main: 'main.js', 
     output: 'main-built.js', 
     almond: false, 
     minify: false 
    }).pipe(gulp.dest('app')); 
}); 

А вот отрывок из нашего main.js файла

require.config({ 
paths: { 
    'text': '../Scripts/text', 
    'durandal': '../Scripts/durandal', 
    'plugins': '../Scripts/durandal/plugins', 
    'transitions': '../Scripts/durandal/transitions' 
}, 
shim: { 
}, 
waitSeconds: 0 
}); 

define('jquery', [], function() { return jQuery; }); 
define('knockout', [], function() { return ko; }); 
define('ga', function() { return ga; }); 

define(
    ["require", "exports", "durandal/app", "durandal/viewLocator", "durandal/system", "plugins/router", "services/logger", "modules/knockout.extensions", "modules/knockout.validation.custom"], 
    function (require, exports, __app__, __viewLocator__, __system__, __router__, __logger__, __koExtensions__, __koValidationCustom__) { 
     var app = __app__; 
     var viewLocator = __viewLocator__; 
     var system = __system__; 
     var router = __router__; 

Как вы можете видеть в gulpfile, мы не хотим использовать миндаль, но RequireJs вместо этого, по каким-то причинам миндаль не работает с нашим проектом, и в любом случае мы предпочитаем RequireJs ли его больше, чем миндаль в конце. Вот где он выглядит, чтобы тормозить. Запуск команды для создания файла main-built.js занял некоторое время, но в конце я получаю файл, построенный со всем в нем.

Проблема в том, что при попытке загрузить приложение оно застревает на экране загрузки. Это не идет дальше, и ошибок в консоли браузера нет.

Я создал новый проект на стороне, чтобы проверить, был ли наш код несколько неисправным и обнаружил, что он может не работать. Вы можете обнаружили, что проект здесь: https://github.com/maroy1986/DurandalGulpBundling

Если я построить этот проект с миндальным вариантом к истине, все работает нормально, но если я включаю almound от сказать глотку использовать RequireJs, я получил такое же поведение, как наше приложение. Вы застряли на экране загрузки без каких-либо ошибок.

Итак, я здесь, я много читаю на эту тему, но не нашел ничего, чтобы решить эту проблему. Надежда, что кто-то здесь уже сталкивается с этим поведением и имеет решение поделиться.

Спасибо!

ответ

1

У меня было такое же требование и проблема. Кажется, require.js не вызывал основной модуль, который запустит приложение Durandal, поэтому он застрял на экране загрузки. Я смог разрешить его, неявным образом называя основной модуль:

gulp.task("durandal", function() { 
    return durandal({ 
     baseDir: "app", 
     main: "main.js", 
     output: "main-built.js", 
     almond: false, 
     minify: true, 
     rjsConfigAdapter: function(config) { 
      //Tell requirejs to load the "main" module 
      config.insertRequire = ["main"]; 
      return config; 
     } 
    }) 
    .pipe(gulp.dest("dist")); 
}); 
+0

Это звучит многообещающе, я посмотрю на него. Благодаря! –

+0

@ Marc-AndreR. Дайте мне знать, если это сработает для вас. У меня точно такое же требование (для использования requirejs вместо миндаля), и у меня была такая же проблема (durandal app не загружается и не застревает при загрузке).После неявного указания загрузки основного модуля (main.js) он работал так же, как при использовании миндаля. Возможно, я смогу настроить репо для этого, поскольку это, вероятно, общая проблема, с которой сталкиваются люди при использовании requirejs и durandal. – cubski

+0

Ну, похоже, что ты понял! Это работает. В приложении все еще есть какие-то проблемы с глюком, такие как вещи, которые не загружаются, но приложение работает глобально рядом с несколькими ошибками javascripts, которые я получаю. Похоже, что он не может найти класс «app», так как я использую его для обновления заголовка страницы с помощью приложения app.title = «any» на маршрутизаторе: событие «навигация». Пытался добавить его в пути requirejs, но это, похоже, не помогает. Если бы у вас была такая же проблема, возможно, вы хотели бы поделиться своим решением :) Спасибо! –

1

Я загрузил ваш проект и попытался построить его с последними версиями глотки и дюрандаля. Первоначально он не строил, и дал мне следующую ошибку:

TypeError: Cannot read property 'normalize' of undefined 

Это проблема с текстом-плагин от RJS, и вы можете решить эту проблему, добавив следующую строку в ваш глотком-файл (рядом с миндалем , Минимизировать, выход ... свойства):

rjsConfigAdapter : function(rjsConfig){ 
      rjsConfig.deps = ['text']; 
      return rjsConfig; 
     } 

После того, как я сделал это, сборка закончена, и я мог бы построить или без Minify, миндаль и требую, и приложение работает отлично.

+0

Я посмотрю на это сегодня вечером. Благодаря! –

+0

Большое спасибо за ваше наблюдение. Я столкнулся с этой проблемой, потому что я переключил наш проект с использования Weyland, который больше не работал с использованием Gulp. Проблема сводила меня с ума, но вышеперечисленные строки исправили проблему. – eesh

Смежные вопросы