binglingnew 2020-02-09
Sea.js 可以解决命名空间污染、文件依赖的问题。
历史上,JavaScript一直没有模块(module)体系,
无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。 其他语言都有这项功能,
比如Ruby的 require、Python的 import ,
甚至就连CSS都有 @import , 但是JavaScript任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。
以后如果不使用第三方规范的情况下,如果写模块可以采用下面这种方式:
1234567891011121314 | 1. 分号是什么意思 匿名自执行函数加分号目的是为了防止前边的代码没有加分号造成语法解析错误 2. 为什么要给你的代码加一个匿名自执行函数 给代码加一个匿名自执行函数,为了避免全局作用域污染,核心是利用函数的私有作用域 3. 为什么要把使用的依赖作为参数传递进来使用的依赖作为参数传递进来母的为了减少作用域查找机制,提高代码执行效率;(function (形参模块名, 依赖项, 依赖项) { window.模块名 = 形参模块名})(window.模块名 || {}, 依赖项, 依赖项) |
在 SeaJS 中,一个 js 脚本文件就是一个模块
每一个模块中有一个 require 函数可以用来加载指定模块需要接收一个模块路径
模块的作用域和导出
如果模块内部的成员想要被外部所访问:
必须通过使用 module.exports 对象向外暴露
require 函数加载模块的时候,会自动拿到模块内部的 module.exports 对象
首先需要在浏览器页面中引包,即引入seajs
1 | 大专栏 js模块化ass="code"><script src="seajs路径"></script> |
调用seajs.use方法
1 | seajs.use(可以引起加载整个模块化的主要就是文件路径,其后缀js可以省略); |
加载的模块化js需要写在defind函数中
1234 | define(function(require,exports,module){ require(暴露接口的路径)返回值为暴露接口对象 代码块}) |
如若想要实现某个功能,且某个功能代码量比较大,可以将该功能写入模块中,通过module.exports
暴露接口
1234567 | define(function(require,exports,module){ function (x,y){ return parseFloat(x)+parseFloat(y); } module.exports.add = add;}) |
每个文件模块中默认的对外的接口对象是module.exports
同时seajs还提供了一个接口对象exports
注意:
exports 是module.exports接口对象的一个引用,也就是说
修改了exports相当于修改了module.exports,但是,如果想要向外
暴露一个单独的变量、函数等成员,那就必须通过给module.exports
赋值才可以
1234567891011121314151617 | define(function (require, exports, module) { // 每一个模块内部相当于有这么一句代码 // var exports = module.exports exports.add = require('./add') exports.sub = require('./sub') // 给 exports 赋值,就切断了和 moudle.exports 之间的引用关系 // 原来的 module.exports 接口对象不受影响 // 所以:在模块内部给 exports 赋值不管用 // exports = function () { // console.log('test') // } // 每一个函数内部相当于有这么一句代码 // return module.exports }) |