通过上述我们就可以知道几个使用方式:
将文件后缀改为
.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中怎么使用import语法的详细内容,更多请关注编程网其它相关文章!