JS模块化(一):CommonJS

简介

CommonJS规范规定,每个模块内部, module 变量代表当前模块。这个变量是一个对象,它的 exports 属性(即 module.exports )是对外的接口。加载某个模块,其实是加载该模块的 module.exports 属性。

使用 require(xxx) 方法,可以加载需要的内置模块、用户自定义模块、第三方模块进行使用。
核心模块和第三方模块:xxx 为模块名
自定义模块:xxx 为模块文件路径

let name = 'now';
let age = 18;
 
let fun = () => {
    console.log('into fun');
    name = 'change'
}
module.exports = {
    name,
    fun
}
var module1 = require('./util/index.js')
var { name, fun } = require('./util/index.js')//解构赋值

module

module 中的属性:

  • module.exports 表示模块对外输出的值。
  • module.id 模块的识别符,通常是带有绝对路径的模块文件名。
  • module.filename 模块的文件名,带有绝对路径。
  • module.loaded 返回一个布尔值,表示模块是否已经完成加载。
  • module.parent 返回一个module对象,表示调用该模块的模块,如果改该模块没有被引用,那么 parent 就是 null
  • module.children 返回一个module数组,表示该模块要用到的其他模块。
  • module.paths 这个用于 require 查找该文件的位置。

require

根据参数的不同格式,require命令去不同路径寻找模块文件:

  • 如果参数字符串以“/”开头,则表示加载的是一个位于绝对路径的模块文件。比如,require(’/home/marco/foo.js’)将加载/home/marco/foo.js。
  • 如果参数字符串以“./”开头,则表示加载的是一个位于相对路径(跟当前执行脚本的位置相比)的模块文件。比如,require(’./circle’)将加载当前脚本同一目录的circle.js。
  • 如果参数字符串不以“./“或”/“开头,则表示加载的是一个默认提供的核心模块(位于Node的系统安装目录中),或者一个位于各级node_modules目录的已安装模块(全局安装或局部安装)。
  • 如果参数字符串不以“./“或”/“开头,而且是一个路径,比如require(‘example-module/path/to/file’),则将先找到example-module的位置,然后再以它为参数,找到后续路径。
  • 如果指定的模块文件没有发现,Node会尝试为文件名添加 .js.json.node后,再去搜索。.js件会以文本格式的JavaScript脚本文件解析,.json文件会以JSON格式的文本文件解析,.node文件会以编译后的二进制文件解析。所以文件名的后缀可以省略。
  • 如果想得到require命令加载的确切文件名,使用require.resolve()方法。

module.exports 和 exports

加载某个模块,其实是加载该模块的 module.exports 属性。

我们还可以导出 exports 直接使用,但需要注意一点,exports 是已经定义的常量,在导出的时候不能在给它定义

let exports = module.exports // 错误 #region exports  Identifier 'exports' has already been declared
exports = module.exports; // 正确的

使用 exports 我们可以这么导出对象,但需要注意一点,在导出对象前不能修改 exports 的指向,若修改 exports 就与 module.exports 不是一个东西了,当然你可以在导出对象后随意修改,这时候就不会影响导出。

exports = module.exports
// exports = ()=>{} 不能修改
exports.fun = () => {
    console.log('into fun');
    name = 'change'
}
exports.name = 'now';
// exports = ()=>{} 随你改

隔离性

CommonJS 规范是在运行时加载的,在运行时导出对象,导出的对象与原本模块中的对象是隔离的,简单的说就是克隆了一份。

在浏览器中使用 CommonJS

因为浏览器中缺少 module exports require global 这个四个变量,所以在浏览器中没法直接使用 CommonJS 规范,非要使用就需要做个转换,使用 browserify,它是常用的 CommonJS 转换工具,可以搭配 gulp webpack 一起使用。

  • 打包命令 browserify app.js -o build.js
    • app.js 为入口文件
    • build.js 为输出文件,页面引用JS文件时应用该文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

激洪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值