Comment publier un module écrit en ES6 de la NGP?
J'étais sur le point de publier un module NPM, quand j'ai pensé à le réécrire dans l'ES6, à la fois de l'avenir, et apprendre ES6. J'ai utilisé Babel à transpile à l'ES5, et effectuer des tests. Mais je ne suis pas sûr de savoir comment procéder:
- Dois-je transpile, et de publier le résultat /dossier de sortie de la NGP?
- Dois-je inclure le résultat dans le dossier mon dépôt Github?
- Ou dois-je maintenir 2 repos, l'un avec l'ES6 code + gulp script pour Github, et un avec le transpiled résultats + tests pour la NGP?
En bref: quelles sont les étapes que je dois suivre pour publier un module écrit en ES6 de MNP, tout en permettant aux gens de parcourir/fourche le code d'origine?
- J'ai été aux prises avec cette décision, ces derniers temps. Je vois la réponse que vous avez marqués comme correct par José> étant le consensus.
- Voici mon 2018 réponse, en tenant compte de l'avancement de la prise en charge du module depuis 2015.
- J'aimerais, si je pouvais faire le contraire. L'utilisation d'un Module ES pour importer un module NPM, mais ce sont les seuls résultats que j'obtiens.
Vous devez vous connecter pour publier un commentaire.
Le modèle que j'ai vu jusqu'à présent est de garder l'es6 fichiers dans un
src
répertoire et de créer vos trucs dans des mnp prepublish à lalib
répertoire.Vous aurez besoin d'une .npmignore fichier similaires à .gitignore, mais ignorant
src
au lieu delib
../node_modules/babel-cli/bin/babel.js -s inline -d lib -w src
. Ce devrait veiller à ce que l'installe de ne pas échouer lors du déploiement de nouveaux environnements..npmignore
vous pouvez utiliser lefiles
champ dans le paquet.json. Il vous permet de spécifier exactement les fichiers que vous souhaitez publier, au lieu de la chasse aux fichiers aléatoires vous ne pas vous voulez publier.J'aime José réponse. J'ai remarqué plusieurs modules de suivre ce motif déjà. Voici comment vous pouvez facilement mettre en œuvre avec Babel6. J'ai installer
babel-cli
localement afin de la construire ne pas casser si jamais je change mon global babel version..npmignore
.gitignore
Installer Babel
paquet.json
scripts
auranode_modules/.bin
ajouté à leur$PATH
et depuisbabel-cli
installe un binaire ànode_modules/.bin/babel
il n'est pas nécessaire à la référence de la commande par le chemin.prepublish
est problématique, car il pouvait courir au moment de l'installation (github.com/npm/npm/issues/3059), préférez le plus idiomatiqueversion
script hook (docs.npmjs.com/cli/version)prepublish
est toujours là. Pour le moment, je pense que la compilation manuelle de lasrc
répertoire etnpm publish
est le chemin à parcourir.prepublishOnly
script hook (voir docs.npmjs.com/misc/scripts#prepublish-and-prepare). Notez que dans la version 5 de mnp, cela devrait fonctionner comme prévu, mais pour l'instant (en supposant que vous êtes à l'aide de mnp v4+) cela devrait fonctionner.prepublish
script. Mais personne (sauf pour les <1%, je juge en erreur) engage lalib/
dossier, comme je peux le voir dans chaque référentiel... — ainsiprepublish
est plus d'une vérification de la syntaxe, pas un pré-rendu (ou: "pré-construit binaires") ?package.json - "files"
(docs) interférer avec.npmignore
?lib
àfiles
et*.doc.xml
à.npmignore
.publish
(obv.), ce qui pousse les choses à mnp (ou partout où vous le configurer). Donc, c'est pour la construction de ce qui se passe dans le package NPM, même si elle n'est pas cochée dans."build"
script, lors de l'exécution de"prepublish": "npm run build"
ou"yarn build"
si votre utilisationyarn
à la place.TL;DR - Ne le faites pas, jusqu'à ~octobre 2019. L'Node.js Les Modules De L'Équipe a demandé:
2019 Peut mettre à jour
Depuis 2015, lorsque cette question a été posée, le support de JavaScript pour les modules a beaucoup évolué, et je l'espère, sera officiellement stable en octobre 2019. Toutes les autres réponses sont maintenant obsolètes ou trop compliqué. Voici la situation actuelle et les meilleures pratiques.
ES6 soutien
99% de l'ES6 (aka 2015) a été pris en charge par le Nœud depuis la version 6. La version actuelle de Nœud est de 12. Tous evergreen navigateurs prennent en charge la grande majorité des ES6 fonctionnalités. ECMAScript est maintenant à version 2019, et le schéma de gestion des versions privilégie désormais l'aide d'années.
ES Modules (aka ECMAScript modules) dans les navigateurs
Tous evergreen navigateurs ont été l'appui
import
-ing ES6 modules depuis 2017. Dynamique des importations sont pris en charge par Chrome (+ fourche comme l'Opéra et le Samsung Internet) et Safari. Assistance de Firefox est prévue pour la prochaine version, 67.Vous n'avez plus besoin Webpack/cumulatif/Colis etc. pour le chargement des modules. Ils peuvent encore être utiles à d'autres fins, mais ne sont pas requis pour charger votre code. Vous pouvez importer directement des URLs pointant vers ES des modules de code.
ES modules Nœud
ES modules (
.mjs
fichiers avecimport
/export
) ont été pris en charge depuis le Nœud v8.5.0 en appelantnode
avec le--experimental-modules
drapeau. Nœud v12, sorti en avril 2019, a réécrit les modules expérimentaux de soutien. La partie la plus visible du changement, c'est que l'extension du fichier doit être spécifié par défaut lors de l'importation:Note obligatoires
.mjs
extensions de partout. Exécuter en tant qu':Le Nœud 12 version est également lorsque les Modules de l'Équipe demandé développeurs de ne pas publier ES paquets de module conçu pour une utilisation par Node.js jusqu'à ce qu'une solution soit trouvée pour l'utilisation de paquets via les deux
require('pkg')
etimport 'pkg'
. Vous pouvez toujours publier natif ES modules destiné aux navigateurs.Le soutien des écosystèmes indigènes ES modules
En Mai 2019, le soutien des écosystèmes pour ES Modules est immature. Par exemple, un test de cadres comme La blague et Ava ne prennent pas en charge
--experimental-modules
. Vous devez utiliser un transpiler, et doit alors décider entre l'utilisation de la nommée à l'importation (import { symbol }
) syntaxe (qui ne fonctionne pas avec la plupart des packages npm encore), et l'importation par défaut de syntaxe (import Package from 'package'
), qui fonctionne, mais pas quand Babel analyse pour les paquets rédigé en caractères d'imprimerie (graphql-outils, noeud à l'afflux, faast etc.) Il y a cependant une solution qui fonctionne à la fois avec--experimental-modules
et si Babel transpiles votre code, de sorte que vous pouvez le tester avec Jest/Ava/Moka etc:Sans doute moche, mais de cette façon, vous pouvez écrire votre propre ES des modules de code avec
import
/export
et de l'exécuter avecnode --experimental-modules
, sans transpilers. Si vous avez des dépendances qui ne sont pas ESM-encore prêt, les importer comme ci-dessus, et vous serez capable d'utiliser des frameworks de test et d'outillage d'autres via Babel.Précédente réponse à la question - n'oubliez pas, ne pas faire ceci jusqu'à ce que le Nœud résout le besoin/l'importation de la question, espérons-le, vers le mois d'octobre 2019.
Publication ES6 modules npm, avec rétro-compatibilité
De publier un module ES à npmjs.org de sorte qu'il peut être importés directement, sans Babel ou d'autres transpilers, il suffit de pointer le
main
champ dans votrepackage.json
à la.mjs
fichier, mais omettre l'extension:C'est le seul changement. En omettant l'extension, le Noeud va d'abord regarder pour une mjs fichier si vous exécutez avec --expérimental-modules. Sinon, il reviendra à la .js fichiers, de sorte que votre transpilation processus de soutenir les anciens Nœud versions fonctionnera comme avant — assurez-vous simplement au point de Babel à la
.mjs
fichier(s).Voici la source pour un natif module ES avec rétro-compatibilité pour le Noeud < 8.5.0 que j'ai publié pour la NGP. Vous pouvez l'utiliser dès maintenant, sans Babel ou quoi que ce soit d'autre.
Installer le module:
Créer un fichier de test test.mjs:
Exécuter nœud (v8.5.0+) avec l' --expérimental-modules drapeau:
Tapuscrit
Si vous développer à la Machine, vous pouvez générer ES6 code et l'utilisation ES6 modules:
Ensuite, vous devez renommer
*.js
sortie de.mjs
, connu question qui nous l'espérons, se fixe bientôt donc,tsc
de sortie peut.mjs
fichiers directement.mjs
fichiers. Node.js les plans de déploiement de soutien officiel en octobre 2019, la plus ancienne, je voudrais sérieusement de revoir tout cela.@Jose est à droite. Il n'y a rien de mal avec la publication ES6/ES2015 de MNP, mais qui peut causer des problèmes, spécialement si la personne à l'aide de votre colis à l'aide de Webpack, par exemple, parce que, normalement, les gens ignorent le
node_modules
dossier alors que le prétraitement avecbabel
pour des raisons de performances.Donc, il suffit d'utiliser
gulp
,grunt
ou tout simplement Node.js pour construire unlib
dossier ES5.Voici mon
build-lib.js
script, que je garde dans./tools/
(pas degulp
ougrunt
ici):Voici un dernier conseil: Vous besoin d'ajouter un .npmignore à votre projet. Si
npm publish
ne trouve pas ce fichier, il va utiliser.gitignore
au lieu de cela, ce qui va vous causer des ennuis parce que, normalement, votre.gitignore
fichier exclure./lib
et comprennent./src
, ce qui est exactement le contraire de ce que vous voulez quand vous êtes à la publication de MNP. Le.npmignore
fichier est fondamentalement la même syntaxe de.gitignore
(autant que je sache)..npmignore
vous pouvez utiliser lefiles
champ dans le paquet.json. Il vous permet de spécifier exactement les fichiers que vous souhaitez publier, au lieu de la chasse aux fichiers aléatoires vous ne pas vous voulez publier..npmignore
, essayezpackage.json
'sfiles
au lieu de cela, voir: github.com/c-hive/guides/blob/master/js/...Si vous voulez le voir en action dans un très simple petit open source Nœud du module, puis jetez un oeil à nième jour (que j'ai commencé - aussi d'autres contributeurs). Regardez dans le package.fichier json et à la prepublish étape qui vous conduira à l'endroit où et comment le faire. Si vous clonez ce module vous pouvez l'exécuter localement et l'utiliser comme un modèle pour yous.
Les deux critères d'un mécanisme national de prévention paquet est qu'il est utilisable avec rien de plus qu'un
require( 'package' )
et fait quelque chose de logiciels-ish.Si vous remplissez ces deux conditions, vous pouvez faire ce que vous souhaitez.
Même si le module est écrit dans l'ES6, si l'utilisateur final n'a pas besoin de savoir ça, je transpile pour l'instant pour obtenir le maximum de soutien.
Cependant, si comme koa, votre module nécessite la compatibilité avec les utilisateurs en utilisant ES6 fonctions, alors peut-être les deux solution serait une meilleure idée.
Emporter
require( 'your-package' )
travail.require( 'package' )
de travail. Je vais modifier ma réponse pour que cela soit plus clair. Cela dit, Jose réponse est beaucoup mieux que la mienne.La clé principale dans
package.json
décide le point d'entrée du colis une fois qu'il est publié. Ainsi, vous pouvez mettre votre Babel de sortie où vous voulez, suffit de mentionner le droit chemin enmain
clé.Voici un bien écrit l'article sur la façon de publier un package npm
https://codeburst.io/publish-your-own-npm-package-ff918698d450
Voici un exemple de pensions de titres que vous pouvez utiliser pour référence
https://github.com/flexdinesh/npm-module-boilerplate
import
pu directement sans nécessiter de Babel ou de tout autre transpilers.Deppending sur l'anatomie de votre module, cette solution peut ne pas fonctionner, mais si votre module est contenues à l'intérieur d'un seul fichier, et n'a pas de dépendances (ne pas utiliser de importation), en utilisant le modèle suivant, vous pouvez libérer votre code tel qu'il est, et sera en mesure d'être importés avec importation (Navigateur ES6 Modules) et besoin (Nœud de CommonJS Modules)
Comme un bonus, il sera suittable être importés à l'aide d'un SCRIPT de l'Élément HTML.
main.js :
my-module.js :
paquet.json :`
Pour utiliser votre module, vous pouvez maintenant utiliser la syntaxe normale ...
Lorsqu'ils sont importés dans NŒUD ...
Lorsqu'ils sont importés dans NAVIGATEUR ...
Ou même lorsqu'ils sont inclus à l'aide d'un Élément de Script HTML...
Quelques notes supplémentaires pour quiconque, à l'aide de propre modules directement à partir de github, ne passant pas par publié modules:
L' (largement utilisé) "prepublish" crochet n'est pas de faire rien pour vous.
Meilleure chose que l'on peut faire (si les plans de compter sur github repos, non publié trucs):
src
de .npmignore (en d'autres mots: l'autoriser). Si vous n'avez pas de.npmignore
, rappelez-vous: Une copie de.gitignore
sera utilisé à la place de l'emplacement d'installation, commels node_modules/yourProject
vais vous montrer.babel-cli
est un depenency dans votre module, et pas seulement un devDepenceny puisque vous êtes en effet bâtiment sur la consommation de la machine aka au développeurs d'applications de l'ordinateur, qui est à l'aide de votre modulene l'accumulation chose, dans le installer le crochet c'est à dire:
"install": "babel src -d lib -s"
(pas d'ajout de valeur à rien d'essayer de "pré-installer", c'est à dire babel-cli est peut-être manquant)
npm pack
de sortie, 3) vérifier à la sortie de la construction.