1.模块化
- 由来:随着网站功能的提示,编写的Javascript代码也越来越庞大,越来越复杂,开发者需要将不同功能的代码进行封装,需要时再引入并调用,这样做一来代码结构清晰,二来可以加快开发速度
- 详细的Javascript模块化编程请参阅:阮一峰 - Javascript模块化编程(二)
2.模块化的类型
- CommonJS规范:nodejs环境实现的就是CommonJS规范,js文件运行在当前规范中时,那么它就可以读取到3个参数,分别是:
参数 |
参数类型 |
说明 |
require |
function |
引入其他模块 |
module |
object |
定义当前模块 |
exports |
object |
定义当前模块 |
- AMD规范:AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。require.js实现的就是AMD规范,js文件运行在当前规范中时,那么它就可以读取到2个参数,分别是:
参数 |
参数类型 |
说明 |
require |
function |
引入其他模块 |
define |
function |
定义当前模块 |
define.amd? |
true |
- |
- ES6规范:ES6的模块化运行时需要打包编译,他的源码不会出现生产环境中,因此无需考虑此种情形
3.如何兼容多个语法规范
if(typeof exports == 'object' && typeof module !== 'undefined'){
console.log('CommonJS规范')
}else if(typeof define == 'function' && define.amd){
console.log('AMD规范')
}else{
console.log('ES6或者script标签引入')
}
- 封装思路:模块化有两种情形,常见的是定义一个函数或者对象,然后将目标字段挂载到当前环境中,以便在当前环境中调用(比如Vue.js和jquery),第二种是插件安装,无需挂载数据,而是执行一段安装代码,例如Vue.use()
(function (global, factory) {
if (typeof exports == 'object' && typeof module !== 'undefined') {
console.log('CommonJS规范')
module.exports = factory()
} else if (typeof define == 'function' && define.amd) {
console.log('AMD规范')
define(factory)
} else {
console.log('script标签引入')
this.plugin = factory()
}
}(this,function(){
var plugin = {}
return plugin;
}))
4.ES6模块化
- 导出:一个模块里面可以定义很多个数据供其他模块引入,这些数据可以分为2种:默认数据和非默认数据,默认数据使用export default语句,只能导出一个,非默认数据使用export语句,可以导出多个
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;
function sayHello(){
console.log('hello')
}
export default sayHello
export { firstName, lastName, year }
- 导入:默认导出的数据使用一个变量名进行接收(变量名不限定),非默认数据定义一个{}对象进行接收,通过结构赋值的形式进行接收(字段名必须一致)
import {firstName, lastName, year} from './utils/test.js'
import hello from './utils/test.js'
- 非默认数据导出重命名:使用as关键字重命名,语法:原名称 as 新的名称,as关键字可以用在模块定义时,也可以用在模块引入时
export { firstName as f_name, lastName, year }
import {firstName as f_name} from './utils/test.js'
- 与CommonJS的区别:CommonJS的加载称为“运行时加载”,即:把整个模块全部导入,然后使用ES6的解构赋值选择性的保存需要的部分(没有用的部分被浪费),ES6的模块导入时为了避免资源浪费,在代码编译阶段,就把需要的字段抽离出来,这就是"编译时加载"
- 其他:ES6的导入导出浏览器不支持,需要编译才能运行,可以在uniapp项目中进行代码测试
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了