2016-04-28 2 views
0

При написании приложения «Чертежи», в котором я использую RequireJS для загрузки модулей (я использую Visual Studio 2015).Ошибка машинописного + RequireJS при загрузке плагина

Я могу легко загрузить практически все модули из классов .ts, которые я написал для внешних библиотек, используя их .d.ts-файлы.

Но моя проблема начинается там, где я хочу загрузить плагин для jquery.

Я использую типизирующий файл для библиотеки, но логически нет определений модулей в файле .d.ts, потому что это просто плагин для jquery.

Я следовал рекомендации для прокладки библиотеки загрузки из RequireJS website так:

requirejs.config({ 
baseUrl: "Scripts", 
paths: { 
    "jquery": "jquery-2.2.3", 
    "jquery.pjax": "jquery.pjax" 
}, 
shim: 
{ 
    "jquery.pjax": 
    { 
     deps: ["jquery"], 
     exports: "jQuery.fn.pjax" 
    } 
} 
}); 
require(["app"]); 

И по RequireJS website:

Прокладка конфигурации только устанавливает код отношения. Чтобы загрузить модули, которые являются частью или используют конфигурацию прокладки, необходим нормальный вызов require/define. Настройка прокладки сама по себе не вызывает загрузку кода.

Теперь ни один из следующих работ для загрузки плагина (даже после перемещения jquery.pjax.dt рядом с jquery.pjax.js):

import * as pjax from "jquery.pjax"; 

import pjax = require("jquery.pjax"); 

import pjax = require("./jquery.pjax"); 

import pjax = require("jquery.pjax.js"); 

import pjax = require("./jquery.pjax.js"); 

Компилятор жалуется с ошибкой Cannot find module "jquery.pjax" или File C:/foo/bar/jquery.pjax.d.ts is not a module.

Приложение app.ts не скомпилируется, если существует какой-либо из приведенных выше кодов, и когда я их удаляю, плагин не загружается.

Относительно того, что я использую несколько импортных файлов в своем файле app.ts, и будет больше, я предпочитаю использовать стиль загрузки модуля import Foo = require("foo") или import * as Foo from "foo", не вписывая функцию AMD define вручную.

Также я использую управление пакетами Nuget, и я предпочитаю не редактировать/перемещать внешние .d.ts или .js файлы вручную.

Может ли кто-нибудь помочь мне понять это, пожалуйста?

ответ

1

Если вы хотите быть в состоянии назвать require("jquery.pjax") то либо должен быть реальный модуль машинописи определена и обнаружимым с этим именем, или там должен быть объявлением о нем где-то: declare module "jquery.pjax".

Я думаю, что ваши варианты:

  • нагрузки JQuery полностью вне RequireJ (например, включает в себя как JQuery и jQuery.pjax с простыми тегами сценария на странице, и просто использовать их в глобальном масштабе). Это то, что у вас есть файл .d.ts, потому что jQuery.pjax вообще не является модулем RequireJS (поэтому вам нужно использовать конфигурацию shim).
  • Добавить модуль декларации в вашу кодовую базу и убедить TypeScript, что это настоящий модуль RequireJS. Это может быть либо внутри вашего существующего определения .d.ts для jquery.pjax, либо автономно в отдельном файле, если вам это проще. Затем вы можете потребовать это.Обратите внимание, что если вам это нужно и не ссылается на него, то TypeScript фактически не выводит зависимость, поэтому вам понадобится поддельная ссылка на него.
  • Используйте RequireJS вручную для его загрузки, вне системы модуля TypeScript. Для таких экосистем плагинов я обычно предоставляю реальной библиотеке имя «raw-libraryname» в моих дорожках RequireJS, а затем создаю новую «libraryname.ts» самостоятельно, которая извлекает необработанную библиотеку и плагины, требует ли какая-либо настройка , и возвращает результат (который все остальные могут зависеть от обычного). Например:

    // Require config: 
    requirejs.config({ 
        baseUrl: "Scripts", 
        paths: { 
         "raw-jquery": "jquery-2.2.3", // only plugins depend on this 
         "jquery.pjax": "jquery.pjax", 
         "jquery": "lib-wrappers/jquery" // everything else uses this which 
                 // includes all your plugins 
        }, 
        shim: 
        { 
         "jquery.pjax": 
         { 
          deps: ["raw-jquery"] 
          // I don't think you need an exports here. 
          // Anybody who wants this should be using it from jQuery. 
         } 
        } 
    }); 
    
    
    
    // in lib-wrappers/jquery.ts 
    define(["raw-jquery", "jquery.pjax"], function ($) { 
        // RequireJS guarantees that this line is run before anything that 
        // depends on jQuery, and after both jQuery & any plugins above are loaded 
        return $; 
    }); 
    

    Это гарантирует, что все еще может продолжать использовать JQuery через RequireJS, как обычно, в то же время гарантируя, что без requirejs модуль (jquery.pjax) будет готов и загружен, прежде чем они пытаются использовать его с JQuery ,

+0

Ну, это очень всеобъемлющий ответ. Подтверждение как ответ сейчас. Благодарю. :) –

+0

Я ответил на что-то подобное, используя defintyped, чтобы проверить это http://stackoverflow.com/questions/21179144/how-do-you-setup-a-require-js-config-with-typescript/42955298#42955298, а Тим правильно! – zobidafly

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