requirejs - Cómo requerir jquery a través de AMD en TypeScript
(5)
PARA TIPOSCRIPT 1.7+
Parece que el estándar está cambiando de nuevo, donde el método por debajo de 0.9+ aún funciona, pero con ES6 que viene, se podría usar la siguiente carga del módulo. (referencia: https://github.com/TypeStrong/atom-typescript/issues/237#issuecomment-90372105 )
import * as $ from "jquery";
e incluso los parciales
import {extend} from "jquery";
(Esto aún requiere jquery.d.ts, si tsd está instalado - tsd install jquery
)
para instalar tsd: npm install tsd -g
PARA TIPOSCRIPT 0.9+
/// <reference path="../../typings/jquery/jquery.d.ts" />
import $ = require(''jquery'');
//Do your stuff
Y también, si su jquery.d.ts no define un módulo externo, agregue lo siguiente a jquery.d.ts:
declare module "jquery" {
export = $;
}
¿Cómo necesito el módulo jquery AMD para mi módulo TypeScript? Por ejemplo, digamos que la estructura de directorios para los scripts se ve así:
jquery-1.8.2.js jquery.d.ts module.ts require.js
Quiero que el archivo js generado de module.ts requiera que jquery-1.8.2.js se cargue a través de require.js.
Actualmente tengo:
import jquery = module(''jquery'')
Esto da como resultado que el nombre "jquery" no existe en el ámbito actual.
- Tome el jquery.d.ts básico de la fuente de TS ( TypeScriptFile )
- Mueva las declaraciones () de JQueryStatic a un módulo como este:
- en tu módulo de código importa el jQuery:
import $ = module("jquery");
declare module "jquery" {
export function (selector: string, context?: any): JQuery;
export function (element: Element): JQuery;
export function (object: { }): JQuery;
export function (elementArray: Element[]): JQuery;
export function (object: JQuery): JQuery;
export function (func: Function): JQuery;
export function (): JQuery;
}
- Compila tu módulo como AMD (tsc --module amd my_code.ts)
- Utilice requirejs para componer su aplicación en el lado del cliente con la siguiente sección de configuración:
requirejs.config({
paths: {
''jquery'': ''js/jquery-1.8.2.min''
}
});
Creo que gran parte de la confusión en torno a esto se debe a que jQuery realmente no actúa como un módulo externo, lo que impide el uso de una declaración de import
. La solución es bastante limpia, simple y lo suficientemente elegante como para no sentirse como una solución alternativa.
He escrito un ejemplo simple de Uso de RequireJS y jQuery en TypeScript , que funciona de la siguiente manera ...
Puede capturar las definiciones de tipo de Definitely Typed for RequireJS y jQuery.
Ahora puede usar RequireJS sin formato con escritura estática dentro del archivo TypeScript.
app.ts
///<reference path="require.d.ts" />
///<reference path="jquery.d.ts" />
require([''jquery''], function ($) {
$(document).ready(() => {
alert(''Your code executes after jQuery has been loaded.'');
});
});
Y luego solo necesita agregar la etiqueta de secuencia de comandos única a su página:
<script data-main="app" src="require.js"></script>
¿Beneficios sobre otras soluciones?
- Puedes actualizar jQuery y RequireJS independientemente
- No tienes que depender de que el proyecto shim se actualice.
- No tiene que cargar manualmente jQuery (o cualquier otra cosa que no sea "como un módulo" para la que tiene un archivo
.d.ts
)
Hace referencia a módulos externos por ruta y nombre de archivo (menos la extensión .js), o simplemente por nombre de archivo si son globales. En su caso, debe hacer esto dentro de module.ts:
import jquery = module(''./jquery-1.8.2'');
Recuerde compilar con --module AMD
ya que, de forma predeterminada, obtendrá un código que utiliza la función commonjs require
.
Primero obtenga el ( require-jquery ) del repositorio oficial de github. Después de esto su directorio se verá como:
require-jquery.js
jquery.d.ts
main.ts
main.js
test.html
Actualmente, la forma más sencilla de trabajar con los módulos JQuery y AMD en TypeScript es escribir lo siguiente en main.ts:
///<reference path="jquery.d.ts" />
declare var require;
require(["jquery"], function($:JQueryStatic) {
$(''body'').append(''<b>Hello JQuery AMD!</b>'');
});
Y llámalo desde tu test.html:
<!DOCTYPE html>
<html>
<head>
<script data-main="main" src="require-jquery.js"></script>
</head>
<body>
<h1>TypeScript JQuery AMD test</h1>
</body>
</html>
¡Espero que esto ayude!