commonJS规范笔记module.exports和exports,export和export default - 日理万妓 2022-11-29 11:57 209阅读 0赞 # commonJS规范笔记 # ### 目录 ### * commonJS规范笔记 * * 1.概述 * 2.module.exports和exports * 3.require命令 * * 3.1基本用法 * 3.2 加载规则 * 3.3 目录的加载规则 * 3.4 模块的缓存 * 3.4 require.main * 4.导入导出模块 * * es5中 * es6中 * * export default * export ## 1.概述 ## ## 2.module.exports和exports ## * `module.exports`属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取`module.exports`变量。 * 为了方便,Node为每个模块提供了一个`exports`变量,指向`module.exports`。在对外输出模块接口时,可以向exports对象添加方法。 * 注意,不能直接将exports变量指向一个值,因为这样等于切断了`exports`与`module.exports`的联系。 * 如果你觉得,`exports`与`module.exports`之间的区别很难分清,一个简单的处理方法,就是放弃使用`exports`,只使用`module.exports`。 ## 3.require命令 ## ### 3.1基本用法 ### 内置的`require`命令用于加载模块文件,基本功能是,读入并执行一个JavaScript文件,然后返回改模块的exports对象。如果没有发现制定模块会报错。 // example.js exports.message = 'hi'; exports.say = function(){ console.log(message) } // index.js var example = require('./example.js'); module.exports = function () { console.log("hello world") } // require命令调用自身,等于是执行module.exports,因此会输出 hello world。 require('./example2.js')() ### 3.2 加载规则 ### `require`命令用于加载文件,后缀名默认为`.js` * `require('/foo.js')` 绝对路径的模块文件 * `require('./foo.js')` 相对路径的模块文件 * 不以`./`或`/`开头,表示加载一个默认提供的核心模块(位于node的系统安装目录中) * 如果参数字符串不以“./“或”/“开头,而且是一个路径,比如`require('example-module/path/to/file')`,则将先找到`example-module`的位置,然后再以它为参数,找到后续路径。 * 如果指定的模块文件没有发现,Node会尝试为文件名添加`.js`、`.json`、`.node`后,再去搜索。`.js`件会以文本格式的JavaScript脚本文件解析,`.json`文件会以JSON格式的文本文件解析,`.node`文件会以编译后的二进制文件解析。 * 如果想得到`require`命令加载的确切文件名,使用`require.resolve()`方法。 ### 3.3 目录的加载规则 ### 通常,我们会把相关的文件会放在一个目录里面,便于组织。这时,最好为该目录设置一个入口文件,让`require`方法可以通过这个入口文件,加载整个目录。 在目录中放置一个`package.json`文件,并且将入口文件写入`main`字段。下面是一个例子。 // package.json { "name" : "some-library", "main" : "./lib/some-library.js" } `require`发现参数字符串指向一个目录以后,会自动查看该目录的`package.json`文件,然后加载`main`字段指定的入口文件。如果`package.json`文件没有`main`字段,或者根本就没有`package.json`文件,则会加载该目录下的`index.js`文件或`index.node`文件。 ### 3.4 模块的缓存 ### 第一次加载某个模块时,Node会缓存该模块。以后再加载该模块,就直接从缓存取出该模块的`module.exports`属性。 ### 3.4 require.main ### `require`方法有一个`main`属性,可以用来判断模块是直接执行,还是被调用执行。 直接执行的时候(`node module.js`),`require.main`属性指向模块本身。 require.main === module // true 调用执行的时候(通过`require`加载该脚本执行),上面的表达式返回false。 ## 4.导入导出模块 ## ### es5中 ### 用`module.exports`和`exports`导出模块,用`require`引入模块。 // exp.js 导出 exports.message = 'hi'; exports.say = function(){ console.log(message) } // imp.js 导入 var example = require('./example.js'); ### es6中 ### `export`和`export default`导出模块,`import`导入模块。 #### export default #### // exp.js 导出 const a = 10; export default a // imp.js 导入 import a from './exp.js' #### export #### // exp.js 导出 const a = 10; const b = 20; export { a, b} // imp.js 导入 import { a, b} from './exp.js'
还没有评论,来说两句吧...