Как создать приложение Durandal, используя requirejs? - PullRequest
0 голосов
/ 26 декабря 2018

Я использую gulp-durandal, но он поддерживает сборку только в один файл.

Теперь я хочу использовать requirejs и функцию bundles, но пока не могу заставить ее работать.

Это файл gulp, который я использовал:

var requirejs = require('requirejs');
var gulp = require('gulp');

var requireJsOptimizerConfig = {
    out: '../dist/main-built.js',
    baseUrl: 'app',
    name: 'main',
    paths: {
        requireLib: '../scripts/require',
    },
    include: [
        "requireLib",
    ],
    insertRequire: ['main'],
    bundles: { },
    mainConfigFile: 'main.js',
};

gulp.task('build', function () {
    requirejs.optimize(requireJsOptimizerConfig);
});

и файл main.js выглядит следующим образом:

requirejs.config({
    paths: {
        'text': '../lib/require/text',
        'durandal':'../lib/durandal/js',
        'plugins' : '../lib/durandal/js/plugins',
        'transitions' : '../lib/durandal/js/transitions',
        'knockout': '../lib/knockout/knockout-3.4.0',
        'bootstrap': '../lib/bootstrap/js/bootstrap',
        'jquery': '../lib/jquery/jquery-1.9.1'
    },
    shim: {
        'bootstrap': {
            deps: ['jquery'],
            exports: 'jQuery'
       }
    }
});

define([...], function(){ ... });

Хотя gulp работает без ошибок, когда я пошелна сайт есть один странный HTTP-запрос:

http://localhost:8080/Scripts/durandal/plugins/widget.js?v=1.0.0.0

Я предполагаю, что плагины внутри папки durandal/js/plugins не скомпилированы правильно.Как я могу решить эту проблему?

Я попытался указать библиотеку widget явно, но она все еще ищет папку Scripts:

paths: {
    requireLib: '../scripts/require',
    'widget': '../Scripts/durandal/plugins/widget',
},
include: [
    "requireLib",
    'widget',
],

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

paths: {
    plugins' : '../lib/durandal/js/plugins'
}

1 Ответ

0 голосов
/ 13 марта 2019

Я нашел решение.Во-первых, requirejs и rjs - это две разные вещи.

requirejs поддерживают bundles, но rjs, инструмент, который выполняет построение / оптимизацию, не имеет этогоoption.

Таким образом, мы должны собирать каждый пакет вручную.И затем, с помощью опции bundles, сообщите requirejs обо всех этих пакетах, что внутри них, добавив следующий код:

require.config({
    bundles: {
        bundle1: ['file1', 'file2'],
        ...
    }
});

Когда нужен файл, requirejs рассмотрит это"map" и загрузите пакет, содержащий этот файл, если он еще не загружен.

Я изменил исходную базу gulp-durandal на основе работы SteveSanderson: durandal-bundler.js ; gulpfile.js

Презентация Стива Сандерсона:

http://vimeo.com/97519516

https://github.com/SteveSanderson/generator-ko

...