模块化

49 阅读2分钟

前言

昨天看见了有关模块化的知识点,“require和import有什么区别”刚开始工作前,我也有遇到这个问题,浅显的只知道动态加载和静态加载,但是实际上实质却是前端模块化。所以去仔细看了看资料,系统的去了解一下八股文内容。

模块化的发展史

  • 全局function
  • namespace命名(隔离同名变量污染问题)
let moduleName={
name:"命名",
foo(),
bar()
}
缺点:moudleName.name="哈哈哈"这样的方式可以对变量直接进行更改
  • IIFE
(function(window) {
  let data = 'www.xianzao.com'
  //操作数据的函数
  function foo() {
    //用于暴露有函数
    console.log(`foo() ${data}`)
  }
  function bar() {
    //用于暴露有函数
    console.log(`bar() ${data}`)
    otherFun() //内部调用
  }
  function otherFun() {
    //内部私有的函数
    console.log('otherFun()')
  }
  //暴露行为
  window.myModule = { foo, bar } //ES6写法
})(window)

特点:外部只能通过向外暴露的方法进行访问或修改
myModule.data  =》结果是undefined

模块化规范

CommonJs(同步加载):

特点:
1.加载顺序按照模块出现的顺序决定,动态加载,代码在运行时执行
2.多次导入,只会运行第一次,二次直接从缓存中读取
3.导出的值是拷贝值,可在外部进行修改,且不会造成变量污染

基本使用:
module.exports或者exports
require

运用环境:
非浏览器端

考点:
常用来跟Es模块化的特点作比较

esModule

特点:
1.静态加载,代码在编译时执行
2.导入的是值的引用,不可进行修改

基本使用:
export或者export default + import

回答问题

问题:importrequire的区别
答:两者其实是模块化的概念,只是属于不同模块化规范,requireCommonJs的一种规范;import是es6的一种规范

CMD,AMD,UMD (通常是异步加载)

CMD: 依赖就近原则
defined(function(require, exports, module){
})

AMD:依赖前置
defined(['module1','module2'],function(m1,m2){
})

UMD:(通用模块化规范)
(function(root, factory) {
    if (typeof module === 'object' && typeof module.exports === 'object') {
        console.log('是commonjs模块规范,nodejs环境')
        module.exports = factory();
    } else if (typeof define === 'function' && define.amd) {
        console.log('是AMD模块规范,如require.js')
        define(factory)
    } else if (typeof define === 'function' && define.cmd) {
        console.log('是CMD模块规范,如sea.js')
        define(function(require, exports, module) {
            module.exports = factory()
        })
    } else {
        console.log('没有模块环境,直接挂载在全局对象上')
        root.umdModule = factory();
    }
}(this, function() {
    return {
        name: '我是一个umd模块'
    }
}))

特点总结:

image.png 这个图片是盗用的:juejin.cn/post/684490…