nodejs 内部模块代码(详解Node.js如何处理ES6模块)
nodejs 内部模块代码
详解Node.js如何处理ES6模块目录
- 一、两种模块的差异
- 二、Node.js 的区分
- 三、CommonJS 模块加载 ES6 模块
- 四、ES6 模块加载 CommonJS 模块
- 五、同时支持两种格式的模块
ES6 模块和 CommonJS 模块有很大的差异。
语法上面,CommonJS 模块使用require()加载和module.exports输出,ES6 模块使用import和export。
用法上面,require()是同步加载,后面的代码必须等待这个命令执行完,才会执行。import命令则是异步加载,或者更准确地说,ES6 模块有一个独立的静态解析阶段,依赖关系的分析是在那个阶段完成的,最底层的模块第一个执行。
二、Node.js 的区分Node.js 要求 ES6 模块采用.mjs后缀文件名。也就是说,只要脚本文件里面使用import或者export命令,那么就必须采用.mjs后缀名。Node.js 遇到.mjs文件,就认为它是 ES6 模块,默认启用严格模式,不必在每个模块文件顶部指定"use strict"。
如果不希望将后缀名改成.mjs,可以在项目的package.json文件中,指定type字段为module。
{ "type": "module" }
一旦设置了以后,该目录里面的 JS 脚本,就被解释用 ES6 模块。
# 解释成 ES6 模块
$ node my-app.js
如果这时还要使用 CommonJS 模块,那么需要将 CommonJS 脚本的后缀名都改成.cjs。如果没有type字段,或者type字段为commonjs,则.js脚本会被解释成 CommonJS 模块。
总结为一句话:.mjs文件总是以 ES6 模块加载,.cjs文件总是以 CommonJS 模块加载,.js文件的加载取决于package.json里面type字段的设置。
注意,ES6 模块与 CommonJS 模块尽量不要混用。require命令不能加载.mjs文件,会报错,只有import命令才可以加载.mjs文件。反过来,.mjs文件里面也不能使用require命令,必须使用import。
三、CommonJS 模块加载 ES6 模块CommonJS 的require()命令不能加载 ES6 模块,会报错,只能使用import()这个方法加载。
(async () => { await import('./my-app.mjs'); })();
上面代码可以在 CommonJS 模块中运行。
require()不支持 ES6 模块的一个原因是,它是同步加载,而 ES6 模块内部可以使用顶层await命令,导致无法被同步加载。
四、ES6 模块加载 CommonJS 模块ES6 模块的import命令可以加载 CommonJS 模块,但是只能整体加载,不能只加载单一的输出项。
// 正确 import packageMain from 'commonjs-package'; // 报错 import { method } from 'commonjs-package';
这是因为 ES6 模块需要支持静态代码分析,而 CommonJS 模块的输出接口是module.exports,是一个对象,无法被静态分析,所以只能整体加载。
加载单一的输出项,可以写成下面这样。
import packageMain from 'commonjs-package'; const { method } = packageMain;
一个模块同时要支持 CommonJS 和 ES6 两种格式,也很容易。
如果原始模块是 ES6 格式,那么需要给出一个整体输出接口,比如export default obj,使得 CommonJS 可以用import()进行加载。
如果原始模块是 CommonJS 格式,那么可以加一个包装层。
import cjsModule from '../index.js'; export const foo = cjsModule.foo;
上面代码先整体输入 CommonJS 模块,然后再根据需要输出具名接口。
你可以把这个文件的后缀名改为.mjs,或者将它放在一个子目录,再在这个子目录里面放一个单独的package.json文件,指明{ type: "module" }。
另一种做法是在package.json文件的exports字段,指明两种格式模块各自的加载入口。
"exports":{ "require": "./index.js", "import": "./esm/wrapper.js" }
上面代码指定require()和import,加载该模块会自动切换到不一样的入口文件。
以上就是详解Node.js如何处理ES6模块的详细内容,更多关于Node.js如何处理 ES6 模块的资料请关注开心学习网其它相关文章!
- docker node 分阶段构建(Docker安装、创建镜像、加载并运行NodeJS程序的详细过程)
- nodejs 内部模块代码(详解Node.js如何处理ES6模块)
- nodejs子进程调试(Node.js实现断点续传)
- nodejs八种命令(详细谈谈NodeJS进程是如何退出的)
- nodejsweb服务(Nodejs实现内网穿透服务)
- pythonweb和nodejs(Node与Python 双向通信的实现代码)
- nodejs架构解析(详解NodeJS模块化)
- nodejs爬虫(node.js做一个简单的爬虫案例教程)
- nodejs游戏服务端框架(如何写Node.JS版本小游戏)
- nodejssocket文件传输(node+socket实现简易聊天室功能)
- nodejs实现websocket服务端(Node.js+express+socket实现在线实时多人聊天室)
- nodejs部署上传文件(node.js使用express-fileupload中间件实现文件上传)
- nodejs json文件读写(nodejs将JSON字符串转化为JSON对象报错的解决)
- nodejs登录案例(利用Node.js创建一个密码生成器的全步骤)
- linux用nvm安装nodejs(nodejs管理工具nvm安装过程详解)
- nodejs的广播机制(node.js如何自定义实现一个EventEmitter)
- 佛肚竹盆景的养护之道(佛肚竹盆景的养护之道)
- 包水饺(包水饺手法怎么包视频)
- 越南河粉(越南河粉来自哪里)
- 按这几方面养护佛肚竹盆景,保证枝叶繁茂,造型优美(按这几方面养护佛肚竹盆景)
- 冰岛旅游攻略(冰岛旅游攻略及花费八日游)
- 寒假旅游攻略(成都寒假旅游攻略)
热门推荐
- jspromise原理(JavaScript使用promise处理多重复请求)
- sql数据拆分插入另一个表(Sql Server数据把列根据指定内容拆分数据的方法实例)
- pythonpil安装包(基于Python的PIL库学习详解)
- 执行mysqldump命令后数据库无反应(关于xampp启动不了mysql数据库的解决方法)
- js RegExp用法
- laravel开发api实例(Laravel框架集成UEditor编辑器的方法图文与实例详解)
- VS中使用Unit Test Generator进行单元测试
- mysql5.7.20非安装版教程(MySQL5.5 部署的一个问题)
- MySQL中NULL和空值的区别
- C#中Obsolete
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9