node.js支持import语法,很简单一个知识点,但是却能提醒我们从知识误区里走出来,多关注外边的知识世界,不断打开自己的知识边界。
js模块化
前端主流模块化规范,目前有以下几种:
- CommonJS, Node.js提出的规范
- ECMAScript Module,ESM,由ECMAScript组织提出的JavaScript标准规范
- 已淘汰的有:CMD、AMD等,再就综合体UMD(支持各种规范的集合体)
因此,主流有两种规范CommonJS
和ESM
两种规范,但是由于Node.js不支持ESM
规范,导致很多时候我们的项目里面并存两种规范的代码,从而出现下面这种情况:
// 在node端执行构建的时候 const _ = require('loadsh') // 在浏览器端实现的时候 import _ from 'loadsh';
这样子开发就很容易出现痛点,往往我们的解决方案就是通过各种构建工具去解决,如:webpack
vite
,尤其是我们在写项目中写node.js编译脚本,经常需要切换。【相关教程推荐:nodejs视频教程、编程教学】
但是从Node.js V14+版本后,它开始支持ESM规范啦,你可以直接在Node.js中使用import
export
等语法了,终于等到这一天?。
PS: 其实早在Node.js V8.5版本就已经加入该特性了,只不过一直需要通过全局变量–experimental-modules
去开启这一特性,由于不稳定性大多数项目都没有开启,不过自从16+后,我们就可以大胆放心在项目中使用了,不过一些古老的项目建议暂时不用开启。
怎么使用
我们先从官网上去看相关使用说明:
Node.js 有两个模块规范:
CommonJS
模块规范 和ECMAScript
模块规范 开发者可以通过.mjs
文件扩展名、package.json
中设置type=module
或node xxx.js --input-type
标志告诉 Node.js 使用ECMAScript
规范去执行代码。 如果没这些设置,Node.js 将使用CommonJS
去执行。Node.js Modules: ECMAScript modules
通过上述我们就可以知道几个使用方式:
将文件后缀改为
.mjs
,node.js加载的时候自动会用ESM
规范在项目中
package.json
新增配置项"type":"module"
,那么整个项目中的.js文件都会按照ESM
规范去执行增加执行参数
--input-type
也可以实现相同效果
各种使用方式
1、常规方式:
import _ from 'lodash'; import { readFile } from 'fs'; import Demo from './Demo.mjs'; // 绝对路径或相对路径都可以 export readFile; export default readFile;
2、带参数的使用:
// 由于参数不同, 这个会让`foo.mjs`被加载两次,而不会利用缓存中的`foo.mjs` import './foo.mjs?query=1'; // loads ./foo.mjs with query of "?query=1" import './foo.mjs?query=2'; // loads ./foo.mjs with query of "?query=2"
3、支持data:
格式URL的形式
import 'data:text/javascript,console.log("hello!");'; // text/javascript 会将后面的内容当成js模块 import { test } from 'data:text/javascript,function test(){console.log("test")};export {test};'; // 这里我们是不是扩宽思路,直接加载在线js呢? import _ from 'data:application/json,"world!"' assert { type: 'json' }; // application/json 则是json // application/wasm for Wasm
4、assert断言(实验特性)
将文件强制加载为某种格式内容,如:json
javascript
webassembly
等
import fooData from './foo.json' assert { type: 'json' };
5、加载commonjs规范模块
当然肯定也支持加载commonjs规范的模块,用法如下:
import { default as cjs } from 'cjs'; // module.exports 导出 import cjsSugar from 'cjs'; // module.exports import * as m from 'cjs';
6、import() 异步导入 这种用法就很正常,不需要实时加载,等到需要用的时候再加载
const { default: barData } = await import('./bar.json', { assert: { type: 'json' } });
7、支持从http/https引入(实验特性)
目前属于实验特性,有限制,比如:
- 不支持http2/3协议
- http协议只能用于127.0.0.1等本地ip地址
- Cookie、Authorization等信息不会携带发送
- 只会加载执行远端的js文件,而不会加载远端中依赖其他文件
import worker_threads from 'node:worker_threads'; import { configure, resize } from 'https://example.com/imagelib.mjs'; configure({ worker_threads });
限制
唯一的限制:当开启ESM规范后,你只允许填写import
或export
,不允许使用require
或module.exports
,会报一下错误:
const a = require('a') ^ ReferenceError: require is not defined in ES module scope, you can use import instead at file:///Users/borfyqiu/Desktop/study/github/qiubohong.github.io/code/demo-rollup/test.mjs:4:12 at ModuleJob.run (node:internal/modules/esm/module_job:193:25) at async Promise.all (index 0) at async ESMLoader.import (node:internal/modules/esm/loader:530:24) at async loadESM (node:internal/process/esm_loader:91:5) at async handleMainPromise (node:internal/modules/run_main:65:12)
总结
其实这个也不算是冷门知识,只要稍微对Node.js有做持续关注,基本上都可以了解到该特性。
但是作为不关注的人,很容易就陷入自己的知识误区,会一直认为Node.js不支持ESM规范,甚至会吐槽Node.js为什么不支持呢?
所以这里有一句话需要提醒自己—— 【书山无路勤为径,学海无涯苦作舟】。
更多node相关知识,请访问:nodejs 教程!
以上是浅析node中怎么使用import语法的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

JavaScript在现实世界中的应用包括服务器端编程、移动应用开发和物联网控制:1.通过Node.js实现服务器端编程,适用于高并发请求处理。2.通过ReactNative进行移动应用开发,支持跨平台部署。3.通过Johnny-Five库用于物联网设备控制,适用于硬件交互。

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

记事本++7.3.1
好用且免费的代码编辑器

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

WebStorm Mac版
好用的JavaScript开发工具

SublimeText3 Linux新版
SublimeText3 Linux最新版