当前位置: 首页 > news >正文

前端进阶课程之模块化(一)CommonJS规范

一:CommonJS规范的应用场景

node模块化采用CommonJS规范,而webpack也是基于node去搭建的,所以webpack内部也是采用commonjs规范

二:node中CommonJS规范的基本应用

// index.js
console.log(module);

// 输出
{
    id: '/Users/x/Documents/code/demo/index.js',
    exports: {},
    parent: { module }, // 调用该模块的模块,可以根据该属性查找调用链
    filename: '/Users/x/Documents/code/demo/index.js',
    loaded: false,
    children: [...],
    paths: [...]
}

说明:
1: 在node环境下,每个js文件都会有一个module对象
2: 模块输出采用module.exports,  模块引入采用require()

注意:
上面的结果只是在node环境下,每个js文件都会有一个module对象,但是在浏览器环境是没有的,需要我们手动去配置。

复制代码

三: node中CommonJS代码实例

基本定义:

1: 模块输出:
//index.js
module.exports = {
    a: 10
}

2: 模块引入
var obj = require('./index.js'); // {a: 10}
复制代码

注意:exports与module.exports的区别:

exports 指向module.exports所指向的对象。只有真正module.exports所引用的对象才会被真正导出,才可以用require去引入


举例来说明:
var obj = {
    a: 10
};
var obj2 = obj;
console.log(obj2,a); //此时可以输出10,
obj2 = {
    a: 20
}

//此时重新给obj2赋值了一个新对象,那么原来obj2与obj1对象关系就切断了。

这里的obj2就相当于exports,obj就相当于module.exports,
所以我们在直接使用exports输出的时候,必须这样使用:
exports.a = 10; 
这样在使用require引入的时候才可以获取到结果,
如果是直接:
exports = {
    a: 10
}
这个时候,在使用require引入的时候,结果为一个空对象{},因为此时module.exports结果为{}, exports直接赋值一个对象,相当于切断了与module.exports的指向,不管赋给什么值,module.exports依然没变,所以require引入的值也没有变化。

复制代码

相关文章:

  • PAT(Basic Level) 乙级练习题 ------ 1031 查验身份证 java
  • bzoj 5210 最大连通子块和——动态DP
  • 理解NGINX的重写break和last,以及location匹配规
  • webpack执行命令参数
  • spark-join算子
  • nodejsvuewebpack
  • jmeter连接数据库之增删改查
  • 设计模式是什么鬼(享元)
  • rsync+sersync实现数据实时同步
  • 「Main」
  • 8.XML相关对象
  • 野生前端的数据结构基础练习(8)——图
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • HyperLeger Fabric SDK开发(二)——Fabric SDK配置
  • Python函数高级
  • [NodeJS] 关于Buffer
  • cookie和session
  • ES6系列(二)变量的解构赋值
  • Git 使用集
  • IOS评论框不贴底(ios12新bug)
  • JSDuck 与 AngularJS 融合技巧
  • passportjs 源码分析
  • Python利用正则抓取网页内容保存到本地
  • Spring Boot MyBatis配置多种数据库
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Tornado学习笔记(1)
  • vue学习系列(二)vue-cli
  • 爱情 北京女病人
  • 思维导图—你不知道的JavaScript中卷
  • 微信小程序--------语音识别(前端自己也能玩)
  • 学习Vue.js的五个小例子
  • 栈实现走出迷宫(C++)
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #{}和${}的区别是什么 -- java面试
  • #前后端分离# 头条发布系统
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (1)bark-ml
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (vue)页面文件上传获取:action地址
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (三)终结任务
  • (五)c52学习之旅-静态数码管
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .Net CF下精确的计时器
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET运行机制
  • @angular/cli项目构建--Dynamic.Form
  • @Autowired 与@Resource的区别
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @JsonFormat与@DateTimeFormat注解的使用