美文网首页webpack学习笔记记录
Webpack工程化笔记(四):CommonJS

Webpack工程化笔记(四):CommonJS

作者: 听书先生 | 来源:发表于2022-02-10 21:44 被阅读0次

    CommonJS是由javascript社区提出的一套包含模块、文件、IO、控制台在内的一系列标准。

    1、模块

    CommonJS中规定每个文件是一个模块,将一个js文件直接通过script标签插入页面中与封装成CommonJS模块最大的不同在于,前者的顶层作用域是全局作用域,在进行变量以及函数声明的时候会污染全局环境。后者会形成一个属于模块自身的作用域,所有的变量以及函数只能自身模块去访问,对外是不可见的。
    示例:

    • getInfo.js:
    export var name = 'getInfo.js中的name'
    
    • index.js:
    import { createRequire } from 'module';
    const require = createRequire(import.meta.url);
    require('./src/index.js')
    var name = 'index.js中的name';
    console.log(name);
    

    node在升级之后,对 require 的使用方法发生了改变。从node.js 14版及以上版本中,require作为COMMONJS的一个命令已不再直接支持使用,所以我们需要导入createRequire命令才可以。

    import { createRequire } from 'module';
    const require = createRequire(import.meta.url);
    
    2、导出

    导出是一个模块向外暴露自身的唯一方式,在CommonJS中,通过module.exports可以导出模块的内容。

    module.exports = {
      name: 'e-kr',
      add: function(a,b) {
        return a+b;
      }
    }
    

    CommonJS模块内部会有一个module对象用于存放当前模块的信息,默认是有一个主体的对象module的,不进行逻辑操作的话相当于导出的module空对象的。

    export.name = 'e-kr';
    

    exports默认指向了module.exports

    3、导入

    在CommonJS中使用require进行模块导入时,

    // getInfo.js
    module.exports = {
        add: function(a,b) {
            return a+b;
        }
    }
    
    // index.js
    const info = require('./getInfo');
    const sum = info.add(2,3);
    console.log(sum);
    
    

    在index.js中导入getInfo模块,并调用它的add函数方法,当我们require一个模块时会产生两种情形:

    • 1、require的模块是第一次被加载,这时会首先执行这个模块,然后再导出内容
    • 2、require的模块是之前被加载过的,这时该模块的代码不会再次执行,而是直接导出之前执行过的结果。
      出现这种情况的原理是:

    模块中有一个module对象专门用来存放其信息,这个对象中有一个属性loaded用于记录该模块是否被加载
    过,它的默认值是false,当模块第一次被加载和执行过后会变成true,后面再次加载时检测到module对象中的loaded属性为true的话就不会再去执行模块代码。

    有时加载一个模块,不需要获取其导出的内容,只想通过执行它而产生某种作用,直接使用require即可。
    此外,require函数可以接收表达式,这个特性可以动态的给我们指定模块的加载路径。

    const moduleNames = ['foo.js', 'bar.js'];
    
    moduleNames.forEach( name => {
      require('./' + name);
    })
    

    相关文章

      网友评论

        本文标题:Webpack工程化笔记(四):CommonJS

        本文链接:https://www.haomeiwen.com/subject/lkuokrtx.html