Pour le fichier main
d'un module npm
, tel que défini par le package.json
, je considérais un modèle comme celui-ci:Inconvénient de la convention d'exportation ES6 et CommonJS
import Struct from './src/struct'
module.exports = Struct
module.exports.default = Struct
Afin de soutenir les CommonJS et les importations de ES6:
const Struct = require('my-module')
// or
import Struct from 'my-module'
Y a-t-il des inconvénients à cette convention qui pourraient causer des problèmes involontaires?
La question que je vais essayer d'aborder est d'avoir à forcer les consommateurs du paquet à coller à ES6 ou CommonJS parce que ces deux semblent plutôt peu recommandables:
const Struct = require('my-module').default
// or
import * as Struct from 'my-module'
Après avoir examiné plus loin, serait de définir ma classe dans /src/struct.js
comme celui-ci est préférable?
export default class Struct {
static get default() {
return Struct
}
...
}
Quel type est 'Struct' dans ce cas? En général, je vous recommande d'éviter d'ajouter des propriétés sur des objets qui ne sont pas définis dans ce même fichier, mais vous pouvez probablement éviter cela en fonction de ce qu'il est réellement.Etant donné que les compilateurs ajoutent généralement de la logique pour que les modules CommonJS fonctionnent automatiquement avec 'import', quel problème essayez-vous spécifiquement d'éviter? – loganfsmyth
@loganfsmyth Eh bien, 'Struct' est simplement une classe avec des fonctionnalités que je voudrais empaqueter comme un module npm, donc l'ajout d'une propriété statique' default' ne semble pas très nuisible. Peut-être devrais-je le rendre non-énumérable ou quelque chose pour éviter de l'énumérer accidentellement? –
Babel utilisera 'module.exports' comme export par défaut si le module importé est CommonJS, donc je ne vois pas comment' module.exports.default = Struct' aide. Est-ce que les autres bundlers ne le font pas? –