热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

NodeJS模块与ES6模块系统语法及注意点详解

这篇文章主要给大家介绍了关于NodeJS模块与ES6模块系统语法及注意点的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

社区模块规范:

1.CommonJS规范

规范实现者:

NodeJS 服务端

Browserify 浏览器

2.AMD规范 全称 异步模块定义

规范实现者:

RequireJS 浏览器

3.CMD规范 通用模块定义

规范实现者:

seaJS 服务端和浏览器通用

官方模块规范

1.ESM规范 就是ES6 Module

各浏览器和服务端

目前常用的就是浏览器端的RequireJS、NodeJS、以及ESM

CommonJS语法分析

module.export

关键

1.module.exports实质上是一个对象,最后模块导出的对象就是这个引用指向的对象

 module.export.key = value
 // eg: 
 module.export.a = 1; 
 // 整体管理导出,此时exports与module.exports指向断开,导致exports上的属性被忽略
 module.export = {
 a:1,
 b:1
 }

2.exports是一个module.export的助手变量,用于就地导出,两者默认指向同一对象,即module.exports === exports true

 // 像比较长的程序,写完所有之后,再去找到需要导出的变量再移到低端的export.module上逐个添加,是相当麻烦,一般在变量下决定是否导出
 //eg 
 let fA = function () {

 }
 module.exports.fA = fA
 let fB = function () {

 }
 module.exports.fB = fB

 // exports 简洁很多
 let fA = function () {

 }
 module.fA = fA
 let fB = function () {

 }
 module.fB = fB

3.在逐个导出时使用exports,而在导出一个对象时,使用module.exports,不建议混用,如果需要,可以作一下处理:

 // 在最后导出时将exports对象和module.exports对象合并
 exports.a = 1
 module.exports = Object.assign({
 b : 1
 },exports)

require

关键:

1.模块区分,知道即可

let f = require('url')

 // 核心模块,第三方模块(npm安装),指定模块名即可
 let f = require ('modulename')
 // 自定义模块,需指定相对或者绝对路径
 let f = require('absolutePATH/relativeAPTH')

2.查找时,没有后缀名的会尝试添加.js、.json、.node,这里可以稍微偷个懒

 let f = require('./circle')
 // 等同于
 let f = require('./circle.js')

ESM语法分析:

export var/function/class

关键:

1.导出值和内部值要有对于关系,即

 // error
 export 1

 // error
 let m = 1
 export m

 // correct
 export let m = 1

 // correct
 let m = 1;
 export {m}

直接在声明时导出或者用一个{}包裹导出

2.export default 用于导出一个默认值,使得用户可以不需要知道内部导出变量名称即可使用

PS: 一个模块只能有一个默认导出

 export default 等同 export {add as default}
 // 不能接变量声明语句
 export default let a = 1

普通导出与默认导出使用的区别

 // 普通导出的导入使用
 export {f}
 import {f} from 'fmod'

 // 默认导出的导入使用,可以无需知道导出模块的内部变量名,任意重命名
 export default f
 import c from 'fmod'

3.导出值与模块值是动态绑定的

export let foo = 'bar';
// 500毫秒后,其他模块拿到的foo值会变成bar
setTimeout(() => foo = 'baz', 500);

import用法

关键:

1.导入非默认变量时需要使用{}语法,并且变量要与导出时变量一致

 // 普通导出的导入使用
 export {f}
 import {f} from 'fmod'

2.导入默认变量时,省略{},并且可以重命名导出变量

 // 默认导出的导入使用,可以无需知道导出模块的内部变量名,任意重命名
 export default f
 import c from 'fmod'

3.可以使用*导出整体模块

 // circle.js
 export let radius = 1
 export let area = 2*PI*radius
 // main.js
 import * as circle from './circle.js'
 circle.radius
 circle.area

4.可以使用,同时导出默认导出和常规导出

import _,{each, forEach} from 'lodash'

5.多次import同一模块,只会执行一次

6.import可以与require混用,但是其在静态分析阶段执行,也就是会先于require加载,这在要求一定的导入顺序时要注意

export { foo, bar } from 'my_module';

// 可以简单理解为,但是合并写法等同于没有在当前模块中导入my_module,即无法使用
import { foo, bar } from 'my_module';
export { foo, bar };

ESM加载CommmonJS

关键:

1.CommonJS模块输出对象module.exports将会被Node转换成默认导出

 // 导出
 export default module.exports
 // 导入,类似导入默认
 import m from './m'

2.此时CommonJS模块变量遵循其规则,不会动态绑定

 module.exports = 123;
 setTimeout(() => module.exports = null,500)
 //500毫秒后,module.exports仍然是123

3.由于CommonJS模块运行时,才会确定输出的module.exports对象,而ESM在编译时就要确定接口,导入时,不允许解构语法

 import {readFile} from 'fs'

解决方案:

 //整体导入 
 import * as express from 'express'
 const app = express.default()
 
 //默认导入,更优
 import express from 'express'
 const app = express() 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。


推荐阅读
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
  • 深入解析ES6至ES8的新特性与应用
    本文详细介绍了自2015年发布的ECMAScript 6.0(简称ES6)以来,JavaScript语言的多项重要更新,旨在帮助开发者更好地理解和利用这些新特性进行复杂应用的开发。 ... [详细]
  • Webpack中实现环境与代码的有效分离
    本文探讨了如何在Webpack中有效地区分开发与生产环境,并实现代码的合理分离,以提高项目的可维护性和加载性能。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文探讨了在 PHP 中处理 JSON 编码时中文字符显示为 Unicode 转义序列的问题,并提供了多种有效的解决方法,包括使用正则表达式替换、URL 编码以及利用 PHP 5.4 及以上版本提供的 JSON_UNESCAPED_UNICODE 选项。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • Composer Registry Manager:PHP的源切换管理工具
    本文介绍了一个用于Composer的源切换管理工具——Composer Registry Manager。该项目旨在简化Composer包源的管理和切换,避免与常见的CRM系统混淆,并提供了详细的安装和使用指南。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 解决Appium Doctor在Python自动化测试中的SyntaxError问题
    本文详细介绍了如何解决在使用Appium Doctor进行环境检查时遇到的SyntaxError: Unexpected token ...问题,并提供了完整的解决方案和最佳实践。 ... [详细]
author-avatar
爱生活爱花落_485
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有