字节一面笔试题其一:有一个库F,实现一段代码,可以兼容前端各种模块规范,使其能在客户端与服务端使用。
看到这个题,脑子里只想到之前刷题时 CommonJs 与 ES Module 区别,还有 AMD | CMD | UMD | CommonJS | ES Module 这些名词,还有代码中 require | import 使用,不知道通过哪些属性来判断,心里想着凉凉了,基础知识不够扎实。结束后想到 axios 是支持客户端与服务端的,就翻了下 axios 代码,作为记录与参考。
;(function Define(root, factory){
if(typeof exports === 'object' && typeof module === 'object') {
// CommonJS 规范,NodeJs 默认规范,用于服务端
module.exports = factory()
}else if(typeof define === 'function' && define.amd) {
// AMD 规范,可以异步加载JS文件,通过define()函数定义,第一个参数是一个数组,里面定义一些需要依赖的包,第二个参数是一个回调函数,通过变量来引用模块里面的方法,最后通过return来输出,如 require.js
define.amd([], factory)
}else if(typeof exports === 'object'){
// ES Module 规范
exports['F'] = factory()
}else {
// 都不支持则挂载到全局 window
root['F'] = factory()
}
})(this, F)
虽然一面凉了,但对模块规范通用性又学到了,继续归纳总结吧。