序
本文主要介绍javascript中require、import和export的相关内容,并分享给大家参考和学习。下面就不多说了。我们来看看详细的介绍。
为什么有模块概念
理想情况下,开发人员只需要实现核心业务逻辑,其他人可以加载其他人已经编写的模块。
然而,Javascript不是一种模块化的编程语言。在es6之前,它不支持“类”,所以没有“模块”。
需求时代
Javascript社区为实现“模块”在现有运行环境中的效果付出了巨大的努力。
原创作品
模块是实现特定功能的一组方法。简单地把不同的函数(和记录状态的变量)放在一起,它就是一个模块。
上面的函数m1()和m2()函数m1 () {//.}函数m2 () {//.}组成一个模块。使用时,直接调用即可。
这种方式的缺点很明显:污染全局变量,无法保证变量名和其他模块之间不会有冲突,模块成员之间也没有直接关系。
物体书写
为了解决上述缺点,可以将模块写成一个对象,所有的模块成员都放在这个对象中
var module1=新对象({_count : 0,m1 : function (){//.},m2 :函数(){//.}});上述函数m1()和m2()封装在module1对象中。当您使用它时,您会呼叫这个物件的属性
module 1 . m1();这样写会暴露所有模块成员,内部状态可以外部重写。例如,外部代码可以直接改变内部计数器的值。
模块。_ count=1;立即执行函数写入
使用“立即调用函数表达式”(IIFE)可以达到不公开私有成员的目的
var模块=(function(){ var _ count=0;var m1=function(){ alert(_ count)} var m2=function(){ alert(_ count 1)} return { m 1: m1,m2:m2}})()使用上述写法,外部代码无法读取internal _ count变量。
console.info(模块。_ count);//undefinedmodule是Javascript模块的基本编写。
主流模块规格
在es6之前,还没有提出一套正式的规范。从社区和框架推广的角度来看,有两种流行的javascript模块规范:CommonJS和AMD
CommonJS规范
2009年,美国程序员Ryan Dahl创建了node.js项目,使用javascript语言进行服务器端编程。
这标志着“Javascript模块化编程”的正式诞生。前端的复杂度是有限的,所以有可能没有模块,但是在服务器端,必须有一个模块来和操作系统等应用交互,否则根本不可能编程。
节点编程中最重要的思想之一是模块,正是这种思想使JavaScript的大规模工程化成为可能。模块化编程在js中很流行,也是基于此。后来,requirejs和seajs等工具包出现在浏览器端。可以说,在相应的规范下,要求在ES6之前主导了所有的模块化编程,甚至是现在,在ES6模块被完全实现之前。
在CommonJS中,暴露模块使用module.exportss和export。很多人不明白为什么会有两个暴露的物体。区别将在后面介绍
在CommonJS中,有一个全局方法require()用于加载模块。假设有一个数学模块math.js,它可以如下加载。
var math=require(' math ');然后,您可以调用模块提供的方法:
var math=require(' math ');math.add(2,3);//5正是因为CommonJS使用的require模式的推广,使得后者AMD和CMD也采用require模式来引用模块样式
AMD规格
有了服务器端模块,自然每个人都想要客户端模块。此外,最好两者兼容,一个模块可以在服务器和浏览器上运行,无需修改。
然而,由于一个主要的限制,CommonJS规范不适合浏览器环境。还是上一节的代码,如果在浏览器中运行,会有很大的问题
var math=require('