39 votes

Pourquoi dit-on que CommonJS ne convient que pour les applications autres que les navigateurs?

Pourquoi ne pas l'utiliser comme modèle de composant général pour Javascript, y compris le Javascript exécuté par le navigateur?

En un coup d'œil, cela semble être un bon moyen de modulariser le projet sur lequel je travaille actuellement, qui consiste en une grande base de code Javascript, avec de nombreux composants, dont certains interagissent les uns avec les autres.

71voto

Kevin Dangoor Points 1533

CommonJS est certainement approprié pour le navigateur, avec quelques mises en garde. Le CommonJS motif de module est très agréable (à mon avis personnel), et est également un bon tremplin pour le module système proposé pour ECMAScript l'Harmonie (la planifié la prochaine version du langage JavaScript). Plus précisément, l'Harmonie des modules n'ont pas accès à l'global ("fenêtre") de l'objet.

La raison pour laquelle certaines personnes prétendent CommonJS modules ne sont pas adaptés pour le navigateur, c'est qu'ils ne peuvent pas être chargées via une balise <script> sans un certain côté serveur de l'aide. Par exemple, imaginez que vous avez un abattement de la bibliothèque que les exportations d'un "convertToHTML" de la fonction. Vous pouvez ensuite faire un module qui ressemble à ceci:

var convertToHTML = require("markdown").convertToHTML;
exports.mangleSomeText = function() {
    // do something then call convertToHTML
}

Cela ne fonctionne pas via une balise script pour quelques raisons (le champ n'est pas emballé, donc convertToHTML serait de s'attacher à la fenêtre, ne nécessitent généralement pas être définis et des exportations doit être créé séparément pour chaque module).

Un client bibliothèque de côté avec un petit peu de côté serveur de l'aide pourrait permettre cette charge grâce à des balises de script facilement. Ou, un client à côté de la bibliothèque qui charge le script via XMLHttpRequest et ne un eval() serait également le travail, si le débogage est souvent pas aussi bonne.

Un assez raisonnable de la solution de l'instant, bien que celui qui est également un sujet de controverse parmi les CommonJS membres, est RequireJS. À l'aide de RequireJS, vous pouvez écrire votre module comme ceci:

define(function(require, exports, module) {

var convertToHTML = require("markdown").convertToHTML;
exports.mangleSomeText = function() {
    // do something then call convertToHTML
}

});

Nous n'avons fait ajouter que define() peu autour du module. (Vous pourriez probablement faire un serveur de le faire assez facilement, de sorte que vous n'avez même pas besoin de taper manuellement le définir en partie).

J'ai personnellement utilisé RequireJS sur quelques projets maintenant et trouver un moyen facile de faire usage de CommonJS modules sans serveur-côté bits. Il existe de nombreuses autres solutions et si vous n'êtes pas tributaire de l'exécution statique JS fichiers, standard CommonJS les modules sont un excellent moyen d'aller.

(ObDisclaimer: j'ai commencé le CommonJS projet, donc je suis clairement biaisée.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: