Как настроить конфигурацию require.js с помощью typescript?
Хорошо, я читал много вопросов и ответов об этом, и многое из этого было мусором.
У меня очень простой вопрос. Как сделать эквивалент этого:
require.config({
paths: {
"blah": '/libs/blah/blah',
}
});
require(['blah'], function(b) {
console.log(b);
});
В typescript?
Это не работает:
declare var require;
require.config({
paths: {
"blah": '/libs/blah/blah',
}
});
import b = require('blah');
console.log(b);
s.ts(8,1): error TS2071: Unable to resolve external module ''blah''.
s.ts(8,1): error TS2072: Module cannot be aliased to a non-module type.
error TS5037: Cannot compile external modules unless the '--module' flag is provided.
Компиляция с флагом -module с компиляцией фиктивных blah.ts, но вывод:
define(["require", "exports", 'blah'], function(require, exports, b) {
require.config({
paths: {
"blah": '/libs/blah/blah'
}
});
console.log(b);
});
Похоже, что это может сработать, но на самом деле нет, require.config находится внутри блока require, он устанавливается после того, как он уже нужен.
SO! До сих пор я оказался в качестве решения:
class RequireJS {
private _r:any = window['require'];
public config(config:any):void {
this._r['config'](config);
}
public require(reqs:string[], callback:any):void {
this._r(reqs, callback);
}
}
var rjs = new RequireJS();
rjs.config({
paths: {
"jquery": '/libs/jquery/jquery',
"slider": '/js/blah/slider'
}
});
rjs.require(['slider'], function(slider) {
console.log(slider);
});
Что кажется ужасным.
Так что будьте ясны, внутри модулей, которые зависят друг от друга, такого рода вещи прекрасно работают:
import $ = require('jquery');
export module blah {
...
}
Мне просто нужен правильный способ установки конфигурации requirejs на верхнем уровне, чтобы импортированные пути для разных именованных модулей были правильными.
(... и это связано с тем, что в основном зависимости сторонних сторон разрешаются с помощью bower и установлены в /lib/blah, где, поскольку файлы прокладки, которые у меня есть для их определений, находятся в файле src/deps/blah.d.ts, поэтому пути импорта по умолчанию неверны после перемещения сгенерированных файлов модулей в/js/на сайте)
NB. Я упомянул jquery здесь, но проблема заключается не в том, что jquery не работает как модуль AMD; Для этого у меня есть файл shim jquery.ts.d. Здесь речь идет о пути requirejs.
Ответы
Ответ 1
Вчера я написал решение этой точной проблемы в своем блоге - http://edcourtenay.co.uk/musings-of-an-idiot/2014/11/26/typescript-requirejs-and-jquery:
TL; DR - создать конфигурационный файл config.ts
, который выглядит примерно так:
requirejs.config({
paths: {
"jquery": "Scripts/jquery-2.1.1"
}
});
require(["app"]);
и убедитесь, что точка входа RequireJS указывает на новый файл конфигурации:
<script src="Scripts/require.js" data-main="config"></script>
Теперь вы можете использовать пространство имен $
из ваших файлов TypeScript, просто используя
import $ = require("jquery")
Надеюсь, что это поможет
Ответ 2
Это сообщение 3 года, и там много изменений, которые были сделаны при использовании Typescript. В любом случае, после некоторого поиска в Интернете, некоторые исследования по документации TS - эти ребята сделали хорошую работу, я нашел кое-что, что могло бы помочь.
поэтому это может относиться к последнему течению TS (2.2.1)
вы, вероятно, знаете, что вы можете использовать
npm install --save @types/jquery
сделайте то же самое для своих сторонних JS librairies, таких как require
теперь вам нужно определить, что должен сделать ваш компилятор TypeScript, и как создать файл tsconfig.json, содержащий:
// tsconfig.json file
{
"compilerOptions": {
"allowJs": true,
"baseUrl": "./Scripts",//Same as require.config
"module": "amd",
"moduleResolution": "Node",//to consider node_modules/@types folders
"noImplicitAny": false,
"target": "es5", // or whatever you want
"watch": true
}
теперь, сосредоточьтесь на необходимости конфигурации
// require-config.ts
declare var require: any;
require.config({
baseUrl: "./Scripts/",
paths: {
"jquery": "vendor/jquery/jquery.x.y.z"
// add here all the paths your want
// personnally, I just add all the 3rd party JS librairies I used
// do not forget the shims with dependencies if needed...
}
});
пока что так хорошо
теперь сосредоточьтесь на своем модуле, написанном в TS, который будет использовать jquery и находится в папке Scripts/Module:
// module/blah.ts
/// <amd-module name="module/blah" />
import $ = require("jquery");
export function doSomething(){
console.log("jQuery version :", $.version);
}
Итак, этот ответ выглядит так же, как Эд Куртен, не так ли?
и user210757 отметил, что он НЕ работает!!!
и это не так! если вы введете консоль tsc -w --traceResolution, you'll see that tsc cannot find any definition for jquery
here how to alleviate assuming you previously launch
npm install --save @types/jquery`, сделав это, в папке с именем node_modules\@types, вы должны получить определение TS для jquery
![screenshot node -module jquery]()
- выберите файл package.json в подпапке jquery
- найдите "основное свойство
-
установите для параметра "jquery" то же самое, что и псевдоним, который вы используете в вашем require.config
и сделано! ваш модуль будет транслироваться как
define("module/blah", ["require", "exports", "jquery"], function (require, exports, $) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function doSomething() {
console.log("jQuery version:", $.fn.jQuery);
}
exports.doSomething = doSomething;
});
и что JS-код выглядит хорошо для меня!
Мне просто не нравится тот факт, что наш список зависимостей модулей "требует и " экспорта, что звучит как проблема с TS, но в любом случае IT WORKS!
Ответ 3
если вы хотите использовать import
для модулей javascript, вам нужно сообщить об этом typescript,
declare var require;
require.config({
paths: {
"blah": '/libs/blah/blah',
}
});
// Important, place in an external.d.ts:
declare module 'blah'{
// your opportunity to give typescript more information about this js file
// for now just stick with "any"
var mainobj:any;
export = mainobj;
}
import b = require('blah');
console.log(b);
альтернативно вы можете просто сделать:
var b = require('blah');
, и он также должен работать