javascript - TypeScript requirejs problem med indlæsning af eksterne moduler
Jeg har problemer med dette game.js-kode, som game.ts-filen kompilerer til:
var GameObjects = require("./GameObjects")
Jeg har opsat min side index.html js-imports således:
<script language="javascript" src="javascripts/require.js" type="text/javascript"> </script>
<script language="javascript" src="javascripts/jquery-1.8.2.min.js" type="text/javascript"> </script>
<script language="javascript" src="ts/GameObjects.js" type="text/javascript"> </script>
<script language="javascript" src="ts/game.js" type="text/javascript"> </script>
og dette er fejlen i Chrome:
Uncaught ReferenceError: exports is not defined GameObjects.js:82
Uncaught Error: Module name "GameObjects" has not been loaded yet for context: _. Use require([]) http://requirejs.org/docs/errors.html#notloaded
nogle idéer venner?
Svar #1
Jeg er ikke sikker på, hvor idéen om manuelt at redigere JavaScript-filerne kommer fra. Hvis du kompilerer din TypeScript med --module amd-flaget, burde du ikke have brug for at redigere JavaScript-filerne, da import-sætningerne vil blive konverteret til require-sætninger.
Den eneste script-tag, du burde have på din side, er denne:
<script src="javascripts/require.js" data-main="ts/game.js"></script>
Når require.js er indlæst, vil det derefter indlæse game.js, og hver gang det støder på en require-erklæring (som er din import-erklæring i din TypeScript-fil), vil det derefter indlæse det script og derefter udføre koden.
Du kan indlæse jQuery og GameObjects og andre moduler blot ved at tilføje import-erklæringer i din TypeScript-fil.
Svar #2
Du har ingen data-main-attribut i dit require.js script-tag. Læs venligst RequireJS-dokumentationen omhyggeligt.
I en nøddeskal: du bør indlæse ts/GameObjects.js fra et topniveau require-kald, som du placerer i filen, der er angivet i data-main-attributten. f.eks. (fra dokumentationen):
<!DOCTYPE html>
<html>
<head>
<title>My Sample Project</title>
<!-- data-main attribute tells require.js to load
javascripts/main.js after require.js loads. -->
<script data-main="javascripts/main" src="javascripts/require.js"></script>
</head>
<body>
<h1>My Sample Project</h1>
</body>
</html>
Så i javascripts/main.js (du kan faktisk kalde det, hvad du vil, så længe det matcher det, du satte i data-main), kalder du require og indlæser dine moduler og gør, hvad du vil med dem:
require(["ts/GameObjects.js", "ts/game.js"], function(GameObjects, Game) {
... use 'GameObjects' and 'Game' here ...
});
Husk, at i ts/GameObjects.js og ts/game.js skal du pakke din kode ind i define()-kald, så de bliver fortolket som moduler.
Håber det hjælper.
