Commonjs和Esmodule

x33g5p2x  于2022-04-21 转载在 其他  
字(2.5k)|赞(0)|评价(0)|浏览(691)

一、写在前面
commonjsesmodule是目前前端主要的模块化方案,下面将具体总结一下,以及两者之间的不同之处。
二、commonjs
2.1

  1. commonjs也叫cjs,在node中每一个js文件都是一个单独的模块,这个模块中包含CommonJS的规范的核心变量: exports module.exports, require,exportsmodule.exports可以负责对模块中的内容进行导出。require函数可以帮助我们导入其他模块(自定义模块,系统模块,第三方库)。

2.2、exports和module.exports之间的区别

  1. 1、每一个模块都是一个module模块,也就是module
  2. 2node中导出的不是exports,而是module.exports
  3. 3、也就是说exportsmodule.exports本来指向的是同一个引
  4. 用地址,但是真正导入的是module.exports,所以当我们手动更改
  5. exports = {},这样就会报错,我们只能改属性。

2.3、require的引入规则

  1. 1、如果存在核心模块(path, url)等,可以直接引入即可。
  2. 2、如果使用./x或者../x以及/x等来引入的话,首先会先找到相应目录下面的x文件,没有找x.js,x.json,x.node,还没有找到就去找./x/index.js, ./x/index.json,./x/index.node文件,如果都不存在,则报错。
  3. 3、如果为第三方库,则按照类似于这种规则进行查找。
  4. /*
  5. [
  6. 'D:\\web前端开发\\javascript高级\\二十五\\一、require的查找规则\\node_modules',
  7. 'D:\\web前端开发\\javascript高级\\二十五\\node_modules',
  8. 'D:\\web前端开发\\javascript高级\\node_modules',
  9. 'D:\\web前端开发\\node_modules',
  10. 'D:\\node_modules'
  11. ]
  12. */
  13. 4require在进行加载模块的时候,后执行一遍里面的代码,但是当该模块中多次引入该模块,则require只会执行一次,因为存在缓存(module中存在loaded函数)。

2.5、加载顺序

  1. //main.js
  2. console.log('main')
  3. require("./aaa")
  4. require('./bbb')
  5. //aaa.js
  6. console.log('aaa')
  7. require('./ccc')
  8. //bbb.js
  9. console.log('bbb')
  10. require('./ccc')
  11. require('./eee')
  12. //ccc.js
  13. console.log('ccc')
  14. require('./ddd')``
  15. //ddd.js
  16. console.log('ddd')
  17. require('./eee')
  18. //eee.js
  19. console.log('eee')
  20. //运行结果是
  21. main
  22. aaa
  23. bbb
  24. ccc
  25. ddd
  26. eee
  27. bbb
  28. //一些包加载一次,就不会进行加载了

2.6、commonjs的缺点

  1. 1commonjs加载是同步的,所以必须等到相应的模块加载完毕,
  2. 在会执行后续代码,在node环境中使用,没有什么问题,因为node
  3. js文件都是本地的。
  4. 2、如果要是在浏览器中执行,因为浏览器中都是从远程服务器上请
  5. 求到的,同步势必会引起一些卡顿。
  6. 3、但是在webpack中可以使用commonjs是因为webpack可以对其
  7. 进行打包处理。

三、esmodule
3.1、基本使用

  1. 1、在浏览器上使用esmodule必须加上type = 'module'
  2. 2、必须需要开启服务器(live server)
  3. 3、在js中引入文件的时候,必须要加上'.js'.

3.2、三中导出方式

  1. //1、第一种导出方式
  2. export const name = 'dl'
  3. export const age = 20
  4. //2、第二种导出方式(集体导出)
  5. const name = '董礼'
  6. const age = 20
  7. function sum(num1, num2) {
  8. return num1 + num2
  9. }
  10. export { //注意:这里不是对象,这里必须这样写
  11. name,
  12. age,
  13. sum
  14. }
  15. //三、第三种导出方式,起别名
  16. const name = 'dl'
  17. const age = 20
  18. export {
  19. name as FName,
  20. age as FAge
  21. }
  1. //三种导入方式
  2. //第一种导入方式
  3. import {
  4. name,
  5. age,
  6. sum
  7. } from './foo.js'
  8. //二、第二种导入方式,起别名
  9. import { name as Fname, age as FAage } from './foo.js'
  10. //三、第三种导入方式
  11. import * as foo from './foo.js'
  1. //default默认导出
  2. const foo = 'foo value'
  3. export default foo
  4. //默认导出二
  5. export {
  6. name,
  7. age,
  8. foo as default
  9. }
  1. //import函数
  2. //为什么要有import函数
  3. 因为在使用import xx from 'xx'的时候,不能将其写在逻辑代码中。
  4. if(true) {
  5. import xx from 'xxx'
  6. }
  7. esmodule在被js引擎解析的时候,就必须知道他的依赖关系,但是
  8. 一些请款下,我们确确实实希望动态来加载一个模块。所以我们可以
  9. 使用import()函数来实现异步加载,浏览器调用另一个线程进行下
  10. 载,然后不会阻塞js线程。import()函数返回的是一个promise
  11. 函数,所以在拿到结果的时候需要使用.then来获取相应的值,
  12. import.meta:es11中新增的一个属性,可以拿到当前文件的url
  13. 地址。

四、两者之间的区别

  1. 4.1commonjs是对模块的浅拷贝,esmodule是对模块的引用。
  2. 4.2import的接口是read-only(只读状态),不能修改其变量
  3. 值。即不能修改变量的指针指向,但是可以改变变量内部的指针指
  4. 向,可以对commonjs对重新赋值,但是esmodule赋值会编译报错。

相关文章