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.exportsimport * 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语法的详细内容。