本文目录一览:
CommonJS与ES6模块化的具体使用方式
所以:只需要将需要暴露给外部的变量或者方法 设置为exports的属性 就行,
可以把exports看做一个全局对象,把所有暴露出来的函数和变量都存放在里面
1.先写个6.js文件
CommonJS规范规定,每个模块内部,module变量代表当前模板,这个变量是一个对象,他的 exports 属性(相当于 module.exports )是对外的接口。 这里详情请看我的另一篇文章: module、exports 和 require的关系
加载某个模块,其实是加载该模块的module.exports属性。require方法用于加载模块
ES6模块化的使用方法:(注!因为CommonJS类库众多,以及 CommonJS 和 ES6 之间的差异,所以无法直接兼容es6。)
直接/按需导出:可使用多个 用变量/常量的方式
导入:需要用按需导入 {解构} 的方式获取
默认导出:只能使用一个 (default属性只有es6才有)可以用引入对象定义多个属性,但这样在引入后调用的时候,更麻烦。
导入:优点:可以直接使用文件做接收参数且不用结构。
重命名export和import
如果导入的多个文件中,变量名字相同,即会产生命名冲突的问题,为了解决该问题,ES6为提供了重命名的方法,当你在导入名称时可以这样做:
如果想看CommonJS与ES6模块化的原理 可以去看我另一篇文章
[秦圆圆]大佬写的 require和import的区别
[大孩子气]大佬写的 require/exports、import/export 的区别
[七分sunshine!]大佬写的# 前端模块化工具 requireJs的使用;
commonjs 与 ES6 模块化
一.commonjs 是什么
是作用于服务端应用程序,让js程序具有模块化功能的一种语法规范,执行方式是同步且运行时加载,
如何使用:
1.module.exports 导出
定义一个匿名对象,将需要导出的成员 赋值到这个匿名对象上,然后再赋值到module.exports 导出
2.exports 导出
exports在每个模块中扮演着一个对象,如同每次在模块中默认执行了let exports = module.exports,那么exports如何使用导出功能呢,只要在exports对象上声明一个要导出去的属性名,将要导出的值赋值进去,
但不能直接赋值给exports对象,否则就和module.exports没有关系,例如:exports=function fn() {},
导入时拿到的是一个undefind
3.require 导入
导入得到是一个对象,对象里面是导出模块所导出的成员,也可以同结构的方式按需导入
二.ES6模块化
es6模块化也是和commonjs一样是具有将js模块化功能的语法规范,不过只能用于在能识别es6语法浏览器环境,es6模块由两个命令构成:export, import; export 是向外提供输出对外接口,import是使用其他模块向内提供输入接口
1.export
使用export 导出想要导出的值,可以是对象,变量,函数
声明 的同时 且导出
将要导出的值赋值给对象的方式导出
那么以exports导出的模块该如何 导入到其他js文件呢?
1.2 导入模块 语法 import
import 是提供接收对外导入的接口
格式: import 以结构的额方式使用大括号包起来,里面填写按需导入的成员,必须和必须和对应模块导出的成员名一致,如果需要更改成员名,需要使用as关键词, from 对接的模块路径
如果需要把一整个模块的所有对象都导入成一个对象 使用 as 关键词,自定义一个对象名
2.0 export default
同样是和export一样暴露指定的变量或者对象函数
但是导入到 其他模块会稍微方便一些,可以不用像export 需要使用{}接收,直接使用一个自定义的对象名接收即可
commonjs与es6模块化直接的差别
commonjs导出是值的拷贝,es6模块化是导出的值的引用
commonjs加载是运行时加载,而es6模块化是编译时加载会比commonjs更加高效
react+webpack 模块化应该采用CommonJS规范还是ES6规范,为什么
研究react的时候也考虑过这个问题,首先可以先了解下这两种模块的机制。参考这里
要考虑的点:
目前Commonjs是nodejs(浏览器环境需要模块加载器)原生支持的,而es6需要借助babeljs来实现。意味着如果要实现自动编译上线(我司没有在线上安装node_modules做法)可能需要将babel之类的node_modules提交代码仓库,大概45M。
还有要考虑下你选择的react的组件库是基于es6还是Commonjs。如果你业务使用Commonjs规范,组件使用es6,这个就没法统一了。
考虑下团队对es6的熟悉程度,关系到代码质量和维护成本。
暂时就想到这些。