Importation et exportation modulaire Js
CommonJs
, AMD
, CMD
, ES6
Sont définis dans les spécifications pour une utilisation modulaire, pour lequel la dépendance entre le module de traitement et la mise en place de la structure des modules standardisés et résoudre les conflits de noms, et à faire usage d'une approche modulaire pour décomposer des systèmes complexes de code est plus raisonnable , Un module gérable avec une maintenabilité plus élevée.
CommonJS
CommonJS
Il s'agit de NodeJs
la spécification des modules côté serveur. Selon cette spécification, chaque fichier est un module avec sa propre portée. Les variables, fonctions et classes définies dans un fichier sont privées et invisibles aux autres fichiers. CommonJS
La spécification stipule que dans chaque module, les module
variables représentent le module actuel. Cette variable est un objet et ses exports
attributs sont des interfaces externes. Le chargement d'un module revient en fait à charger les exports
propriétés du module . Bref, les CommonJS
spécifications sont require
importées module.exports
et exports
exportées.
// 1.js
var a = 1;
var b = function(){
console.log(a);
}
module.exports = {
a: a,
b: b
}
/*
// 当导出的模块名与被导出的成员或方法重名时可以有如下写法
module.exports = {
a,
b
}
*/
// 2.js
var m1 = require("./1.js")
console.log(m1.a); // 1
m1.b(); // 1
Il peut également être utilisé exports
pour l'exportation, mais vous ne devez pas réécrire exports
le pointeur, car il exports
ne s'agit que d'un pointeur et pointe vers module.exports
la zone de mémoire, c'est-à-dire que la exports = module.exports = {}
réécriture exports
modifie le pointeur au point que le module ne peut pas être exporté, ce qui exports
fournit simplement une solution simple pour l'écriture En fin de compte, en fait, tous utilisent l' module.exports
exportation. En outre si elles sont utilisées simultanément dans un seul fichier module.exports
et exports
puis exporter uniquement le module.exports
contenu
// 1.js
var a = 1;
var b = function(){
console.log(a);
}
exports.a = a;
exports.b = b;
// exports = { a, b } // 不能这么写,这样就改变了exports的指向为一个新对象而不是module.exports
// 2.js
var m1 = require("./1.js")
console.log(m1.a); // 1
m1.b(); // 1
AMD
AMD
La spécification ne l'est pas AMD YES
, la AMD
définition du module asynchrone, le nom complet de la Asynchronous Module Definition
spécification, est une solution modulaire côté navigateur. Le CommonJS
module d'introduction de spécification est chargé de manière synchrone, ce qui n'est pas un problème côté serveur, car ses modules sont stockés sur le disque dur et peuvent attendre la fin du chargement synchrone Dans le navigateur, le module est chargé via le réseau. S'il est bloqué de manière synchrone et attend que le module se charge, il peut y avoir une situation où la page du navigateur est suspendue AMD
. Le module est chargé de manière asynchrone. Le chargement du module n'affecte pas le fonctionnement des instructions qui se trouvent derrière. Toutes les instructions qui dépendent de ce module sont définies dans une fonction de rappel. Cette fonction de rappel ne s'exécutera pas tant que le chargement n'est pas terminé, ce qui RequireJS
correspond à la AMD
spécification.
require(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){
// do something
});
define(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){
// do something
return {};
});
/**
define和require在依赖处理和回调执行上都是一样的,不一样的地方是define的回调函数需要有return语句返回模块对象(注意是对象),这样define定义的模块才能被其他模块引用;require的回调函数不需要return语句,无法被别的模块引用
*/
// html的<script>标签也支持异步加载
// <script src="require.js" defer async="true" ></script> <!-- async属性表明这个文件需要异步加载,避免网页失去响应。IE不支持这个属性,只支持defer,所以把defer也写上。 -->
CMD
CMD
La définition générale du module est SeaJS
la sortie standardisée de la définition du module dans le processus de promotion, et est également une solution modulaire asynchrone côté navigateur. La différence entre le CMD
et AMD
est principalement due à:
- Pour les modules dépendants, il
AMD
est exécuté à l'avance (fonction de rappel relativement définie, leAMD
chargeur doit charger toutes les dépendances à l'avance et appeler l'exécution puis exécuter la fonction de rappel), ilCMD
s'agit d'une exécution différée (fonction de rappel relativement définie, leCMD
chargeur doit charger toutes les dépendances Après l'exécution de la fonction de rappel, lorsque l'exécution nécessite le module dépendant, la dépendance chargée est appelée et renvoyée à la fonction de rappel), maisRequireJS
depuis le2.0
début, elle peut également être modifiée pour retarder l'exécution AMD
Il dépend de l'avant (lorsque vous définissez le module, vous devez déclarer le module dont il dépend), et ilCMD
est le plus proche de la dépendance (ne partez que lorsque vous avezrequire
besoin d' un certain module de charge à la demande, retournez immédiatement après utilisation ).
define(function(require,exports,module){
var a = reuire('require.js');
a.dosomething();
return {};
});
ES6
ES6
La fonction du module est implémentée au niveau des standards linguistiques, afin de devenir une solution de module commune pour les navigateurs et les serveurs. Le ES6
standard utilise export
et export default
pour exporter le module et utilise le import
module d'importation. De plus , le module qui peut être utilisé require
pour importer export
et export default
exporter dans l'environnement du navigateur est toujours recommandé, mais il est toujours recommandé d'utiliser le import
module d'importation standard.
export
Les export default
principales différences sont les suivantes:
export
Peut être importé sur demande,export default
nonexport
Il peut y en avoir plusieurs,export default
un seulexport
Peut exporter directement des expressions variables,export default
nonexport
Exporter par le biais de{}
,export default
il doit être ajouté lors de l'importation , il n'est pas nécessaire
// 1.js
var a = 1;
var b = function(){
console.log(a);
}
var c = 3;
var d = a + c;
var obj = { a,b,c }
export {a,b};
export {c,d};
export default obj;
<!-- 3.html 由于浏览器限制,需要启动一个server服务 -->
<!DOCTYPE html>
<html>
<head>
<title>ES6</title>
</head>
<body>
</body>
<script type="module">
import {a,b} from "./1.js"; // 导入export
import m1 from "./1.js"; // 不加{}即导入export default
import {c} from "./1.js"; // 导入export 按需导入
console.log(a); // 1
console.log(b); // ƒ (){ console.log(a); }
console.log(m1); // {a: 1, c: 3, b: ƒ}
console.log(c); // 3
</script>
</html>
Référence
https://segmentfault.com/a/1190000010426778
https://www.cnblogs.com/leftJS/p/11073481.html
https://www.cnblogs.com/zhoulujun/p/9415407.html
https://www.cnblogs.com/zhoulujun/p/9415407.html
https://www.cnblogs.com/moxiaowohuwei/p/8692359.html