Écrire TypeScript et émettre une bibliothèque pour le navigateur et le nœud

J’ai une bibliothèque interne utilisée dans Node.js et navigateur. Il contient de nombreux fichiers, concaténés avec une tâche Grunt et différents prologs, un pour le navigateur, un pour le nœud:

navigateur:

// dependent 3rd-party libs like Mustache are already global window.myLib = { /*just a namespace object filled with stuff later*/ } // then comes the plain javascript which just adds elements to myLib. // This part is identical to that used in Node // example: myLib.renderPartDetail = function (...) {...}; 

Nœud:

 var Mustache = require('mustache'); var myLib = {}; module.exports = myLib; // then comes the plain javascript which just adds elements to myLib. // This part is identical to that used in Browser 

Il en résulte 2 fichiers js uniques différents en sortie, un pour le navigateur et un pour le nœud.

Ce que j’aimerais

  • utiliser TypeScript
  • Si possible, utilisez une seule syntaxe CommonJS (ou modules ES6) pour le navigateur et le noeud.
  • investir dans quelque chose de ne pas mourir dans les prochains mois
  • être un peu plus modulaire (peut-être que quelqu’un n’a besoin que d’une partie de la bibliothèque)

Ce qui me trouble

Je trouve 2 types différents de gestion de module dans TypeScript:

 import {a, b} from './x' 

et

 import c = require('./y') 

Je suis habitué à ce dernier noeud, mais le premier ressemble à ES6 (qui pourrait être le futur).

Actuellement, j’utilise tsc --module commonjs mais ce n’est que le format de sortie, non? Il existe également --module system mais je ne trouve pas de documentation pour cette option et lorsque je l’utilise, le compilateur se plaint de l’ export = ... n’est pas autorisé.

browserify n’avons pas encore joué avec browserify , tsify , watchify , jspm , SystemJS, webpack – c’est trop semblable et trop, mais je pense qu’un ou plusieurs de ces outils pourraient faire le travail pour moi.

Et quand j’ai require() , tsc ne peut pas trouver le module: “TS2307: impossible de trouver le” moment “du module externe”.

Questions concrètes

  • Quelle syntaxe de module dois-je utiliser dans mon code pour utiliser au mieux Node and Browser?
  • Quelle chaîne d’outils va résoudre mes besoins? Existe-t-il un exemple de projet ou un modèle standard depuis lequel je peux copier? (Je suis ouvert à Gulp également, je n’ai pas besoin d’utiliser Grunt).
  • Quelles versions de TypeScript et Node sont actuellement sockets en charge? La version 1.4 étant intégrée à IntelliJ, lors de la référence à 1.6.2 en tant qu’externe, des messages d’erreur cryptiques très profonds tels que “TypeError: host.fileExists n’est pas une fonction” (ne trouve rien de bon à ce sujet). Ce n’est peut-être pas optimal d’utiliser Node v4.1.1?

Je suis désolé que ce post est si complexe. Si nécessaire, donnez-moi simplement un conseil pour savoir par où commencer ou quelle est la chose la plus importante à changer ou à commencer.

Quelle syntaxe de module dois-je utiliser dans mon code pour utiliser au mieux Node and Browser?

Si vous es5 deux syntaxes sont es5 la même chose. Utilisez soit, et n’hésitez pas à mélanger et assortir.

Quelle chaîne d’outils va résoudre mes besoins? Existe-t-il un exemple de projet ou un passe-partout où je peux copier

J’utilise (et recommande) webpack. Vous pouvez utiliser commonjs / nodejs tel quel et ensuite webpack peut créer des bundles pour front-end. Pour un exemple, voir https://github.com/basarat/tsb/tree/master

Quelles versions de TypeScript et Node sont actuellement sockets en charge? La version 1.4 étant intégrée à IntelliJ, lors de la référence à 1.6.2 en tant qu’externe, des messages d’erreur cryptiques très profonds tels que “TypeError: host.fileExists n’est pas une fonction” (ne trouve rien de bon à ce sujet). Ce n’est peut-être pas optimal d’utiliser Node v4.1.1?

Utilisez la dernière version de TypeScript (divers outils de TypeStrong, par exemple atom-typescript / grunt-ts / ts-loader qui supporte cela). L’erreur que vous obtenez est une erreur webstorm et doit leur être signalée. (J’utilise un atome-type).

J’ai également l’erreur TypeError: host.fileExists avec WebStorm 10 et un compilateur Typescript personnalisé (installé via npm).

Cependant, ceci est corrigé dans WebStorm 11 (publié le 2 novembre 2015) https://www.jetbrains.com/webstorm/download/