Node冷门知识点—— node.js支持import语法

简介: Node冷门知识点—— node.js支持import语法

js模块化


前端主流模块化规范,目前有以下几种:

  • CommonJS, Node.js提出的规范
  • ECMAScript Module,ESM,由ECMAScript组织提出的JavaScript标准规范
  • 已淘汰的有:CMD、AMD等,再就综合体UMD(支持各种规范的集合体)


因此,主流有两种规范CommonJSESM两种规范,但是由于Node.js不支持ESM规范,导致很多时候我们的项目里面并存两种规范的代码,从而出现下面这种情况:

// 在node端执行构建的时候
const _ = require('loadsh')
// 在浏览器端实现的时候
import _ from 'loadsh';

这样子开发就很容易出现痛点,往往我们的解决方案就是通过各种构建工具去解决,如:webpackvite,尤其是我们在写项目中写node.js编译脚本,经常需要切换。


但是从Node.js V14+版本后,它开始支持ESM规范啦,你可以直接在Node.js中使用importexport等语法了,终于等到这一天😭。


PS: 其实早在Node.js V8.5版本就已经加入该特性了,只不过一直需要通过全局变量–experimental-modules去开启这一特性,由于不稳定性大多数项目都没有开启,不过自从16+后,我们就可以大胆放心在项目中使用了,不过一些古老的项目建议暂时不用开启。

怎么使用


我们先从官网上去看相关使用说明:

Node.js 有两个模块规范:CommonJS模块规范 和 ECMAScript模块规范 开发者可以通过 .mjs 文件扩展名、package.json中设置type=modulenode xxx.js --input-type 标志告诉 Node.js 使用 ECMAScript规范去执行代码。 如果没这些设置,Node.js 将使用 CommonJS 去执行。Node.js Modules: ECMAScript modules

通过上述我们就可以知道几个使用方式:

1.将文件后缀改为.mjs,node.js加载的时候自动会用ESM规范

2.在项目中package.json新增配置项"type":"module",那么整个项目中的.js文件都会按照ESM规范去执行

3.增加执行参数--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断言(实验特性) 将文件强制加载为某种格式内容,如:jsonjavascriptwebassembly

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规范后,你只允许填写importexport,不允许使用requiremodule.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为什么不支持呢?


所以这里有一句话需要提醒自己—— 【书山无路勤为径,学海无涯苦作舟】。


做一个有温度的技术分享作家 —— Qborfy

参考资料


目录
相关文章
|
1月前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
46 1
|
17天前
|
存储 JavaScript NoSQL
Node.js新作《循序渐进Node.js企业级开发实践》简介
《循序渐进Node.js企业级开发实践》由清华大学出版社出版,基于Node.js 22.3.0编写,包含26个实战案例和43个上机练习,旨在帮助读者从基础到进阶全面掌握Node.js技术,适用于初学者、进阶开发者及全栈工程师。
46 9
|
1月前
|
自然语言处理 JavaScript 前端开发
[JS]知识点
本文介绍了JavaScript中的多个重要知识点,包括ES6、严格模式、类与对象、解构、跨域问题及入口函数等。文章通过详细示例和推荐的外部资源,帮助读者更好地理解和应用这些概念。内容持续更新中,适合初学者和进阶开发者参考。
21 2
[JS]知识点
|
1月前
|
JavaScript 前端开发 中间件
JS服务端技术—Node.js知识点
本文介绍了Node.js中的几个重要模块,包括NPM、Buffer、fs模块、path模块、express模块、http模块以及mysql模块。每部分不仅提供了基础概念,还推荐了相关博文供深入学习。特别强调了express模块的使用,包括响应相关函数、中间件、Router和请求体数据解析等内容。文章还讨论了静态资源无法访问的问题及其解决方案,并总结了一些通用设置。适合Node.js初学者参考学习。
44 1
|
1月前
|
开发框架 JavaScript 前端开发
Node.js日记:客户端和服务端介绍、Node.js介绍
Node.js日记:客户端和服务端介绍、Node.js介绍
|
1月前
|
存储 JavaScript 前端开发
JS的ES6知识点
【10月更文挑战第19天】这只是 ES6 的一些主要知识点,ES6 还带来了许多其他的特性和改进,这些特性使得 JavaScript 更加现代化和强大,为开发者提供了更多的便利和灵活性。
26 3
|
1月前
|
JavaScript 前端开发 开发工具
Node.js——初识Node.js
Node.js——初识Node.js
34 4
|
1月前
|
JavaScript 前端开发 持续交付
构建现代Web应用:Vue.js与Node.js的完美结合
【10月更文挑战第22天】随着互联网技术的快速发展,Web应用已经成为了人们日常生活和工作的重要组成部分。前端技术和后端技术的不断创新,为Web应用的构建提供了更多可能。在本篇文章中,我们将探讨Vue.js和Node.js这两大热门技术如何完美结合,构建现代Web应用。
38 4
|
1月前
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API
使用JavaScript和Node.js构建简单的RESTful API