2015-12-10 2 views
0

Когда все сценарии загружаются индивидуально, все работает как шарм. Сейчас я пытаюсь оптимизировать.Оптимизатор r.js - построение все включено js с некоторыми модулями и некоторые прокладки

Однако, поскольку некоторые из загруженных .js являются прокладками, это просто не работает, никаких ошибок JavaScript в консоли, похоже, что ничего не происходит. файл

testRjs.js

({ 
    baseUrl: "./dist/", 
    paths: { 
     "requireLib": "./require", 
     "app": "./app", 
     "main": "./main", 
     "jquery": "./jquery-2.1.4", 
     "jqbsace": "./jqbsace", 
     "datatables": "./jquery.dataTables", 
     "moment": "./moment", 
     "momentTZ": "./moment-timezone", 
     "momentDF": "./moment-duration-format", 
     "datarangepicker": "./daterangepicker/daterangepicker", 
     "highstock": "./highstock", 
     "bootstrap": "./bootstrap", 
     "aceconcat": "./aceconcat", 
     "jstz": "./jstz-1.0.4.min", 
     "shared": "./controllers/shared1", 
     // Controller modules 
     "casnodes/chronicnodes": "./controllers/casnodes/chronicnodes" 
    }, 
    shim: { 
     "datarangepicker": ["jquery"], 
     "highstock": ["jquery"], 
     "jstz": { 
      exports: "jstz" 
     }, 
     "bootstrap": ["jquery"], 
     "aceconcat": ["bootstrap"], 
     "momentTZ": ["moment"], 
     "momentDF": ["moment"] 
    }, 
    name: "casnodes/chronicnodes", 
    out: "chronicnodesTest.js", 
    wrapShim: true, 
    include: ["requireLib"] 
}) 

chronicnodes модуль:

define(["jquery", "datatables", "highstock", "moment", "datarangepicker", "aceconcat"], function($) { 

    $('#allChronicView').DataTable({ 
     ajax: { 
      url: ajaxUrl 
     }, 
     dom: 'Bfrtip', 
     buttons: [{ 
       extend: 'excel', 
       text: 'Export (Excel)' 
      }, 

      { 
       extend: 'csv', 
       text: 'Export (CSV)' 
      }, 

      { 
       extend: 'pdf', 
       text: 'Export (PDF)' 
      } 
     ], 
     'columns': [{ 
      'type': 'num', 
      'data': 'NodeId', 
      render: function(data, type, row) { 
       return '<a id="http://shield?id=' + data + '" onclick="return false;"> ' + data + ' </a>' 
      } 
     }, { 
      'data': 'Name' 
     }, { 
      'data': 'Alias' 
     }, { 
      'type': 'string' 
     }, { 
      'type': 'string' 
     }, { 
      'type': 'date', 
      'data': 'DateQuery' 
     }, { 
      'type': 'num', 
      'data': 'Condition' 
     }, { 
      'type': 'num', 
      'data': 'TimeSecLastCondition' 
     }, { 
      'type': 'num', 
      'data': 'Occur' 
     }, ], 
     "columnDefs": [{ 
      "targets": 0, 
      "visible": false 
     }, { 
      // The `data` parameter refers to the data for the cell (defined by the 
      // `data` option, which defaults to the column being worked with, in 
      // this case `data: 0`. 
      "render": function(data, type, row) { 
       var mDate = moment(data); 
       return mDate.tz(jstz.determine().name()).format('M/D/YYYY HH:mm:ss z'); 
      }, 
      "targets": 5 
     }, { 
      "render": function(data, type, row) { 
       var str = row["Name"].substring(3, 5); 
       return str; 
      }, 
      "targets": 3 
     }, { 
      "render": function(data, type, row) { 
       var str = row["Name"].substring(5, 9); 
       return str; 
      }, 
      "targets": 4 
     }] 
    }); 
}); 

здания, как это:

узел r.js -o testRjs.js

в том числе HTML, как это:

<script> 
     var ajaxUrl = '@Url.Content(url)'; 
</script> 
<script src="~/Scripts/chronicnodesTest.js"></script> 

На стороне записки, файл chronicnodes.js не имеет ничего все вложенные в $ (документ) .ready(), это могло быть проблемой?

Справка приветствуется.

ответ

0

Вы должны изучить использование shim.

Например moment-timezone называет define, как вы можете видеть here:

if (typeof define === 'function' && define.amd) { 
    define(['moment'], factory);     // AMD 
} 

Так что не нужно shim. Использование прокладки с кодом, вызывающим define, приводит к неопределенному поведению. Иногда это не имеет никакого эффекта, но иногда оно вызывает проблемы. Поэтому неудивительно, что здесь ненужный shim для moment-timezone не вызовет проблемы до оптимизации, но вызывает проблемы после.

Еще одна вещь, которую вы должны проверить - есть ли какой-либо модуль, который использует shim, который должен иметь опцию exports. Некоторые из модулей, которые вы используете, явно не необходимо a exports. Например, Bootstrap устанавливает сам плагины jQuery, а не объявляет символы в глобальном пространстве. Однако для других модулей, которые вы используете, может понадобиться exports. (Я не знаком со всеми модулями, которые вы используете, поэтому я точно не знаю.) Без wrapShim: true вы могли бы уйти с отсутствующим exports, но при включенной опции отсутствующий exports приведет к сбою вашего кода. Это не проблема для не оптимизированного кода.