Open chenshenhai opened 6 years ago
我的天,各种url 绕来绕去
const baseURL = new URL('file://'); parentModuleURL=baseURL;
👍
我记得koa2现阶段是不支持import引入的又或者是在inexjs启动文件中不支持。
我记得koa2现阶段是不支持import引入的又或者是在inexjs启动文件中不支持。
不是koa2 不支持import,而是你的node 需要开启这个支持才行。
这个运行之后不会报错吗
≥ node --experimental-modules --loader ./custom-loader.mjs server/index.js 14:45
(node:73405) ExperimentalWarning: --experimental-loader is an experimental feature. This feature could change at any time
(Use node --trace-warnings ...
to show where the warning was created)
internal/process/esm_loader.js:74
internalBinding('errors').triggerUncaughtException(
^
TypeError [ERR_INVALID_URL]: Invalid URL: [object Object] at onParseError (internal/url.js:257:9) at new URL (internal/url.js:333:5) at new URL (internal/url.js:330:22) at resolve (file:///Users/huahua/Desktop/scripts/custom-loader.mjs:49:20) at Loader.resolve (internal/modules/esm/loader.js:85:40) at Loader.getModuleJob (internal/modules/esm/loader.js:229:28) at Loader.import (internal/modules/esm/loader.js:164:28) at internal/modules/run_main.js:46:28 at Object.loadESM (internal/process/esm_loader.js:68:11) { input: '[object Object]', code: 'ERR_INVALID_URL'
@xiaohuaxiangwoyiyang 您好,这个文章是3年前写的,Node已经支持原生ES module使用了,不需要原来实验中的方法哈。 您提供的这个报错里就有这个提示哈
ExperimentalWarning: --experimental-loader is an experimental feature. This feature could change at any time
前言
Node 9最激动人心的是提供了在flag模式下使用
ECMAScript Modules
,虽然现在还是Stability: 1 - Experimental
阶段,但是可以让Noder抛掉babel等工具的束缚,直接在Node环境下愉快地去玩耍import/export
如果觉得文字太多,看不下去,可以直接去玩玩demo,地址是https://github.com/chenshenhai/node-modules-demo
Node 9下import/export使用简单须知
import/export
的文件后缀名必须为*.mjs
(下面会讲利用Loader Hooks兼容*.js
后缀文件)--experimental-modules
import
和export
必须严格按照ECMAScript Modules
语法ECMAScript Modules
和require()
的cache机制不一样快速使用import/export
mod-1.mjs
,mod-2.mjs
文件index.mjs
console.log(
Mod1.num = ${Mod1.num}
) Mod1.increase(); console.log(Mod1.num = ${Mod1.num}
) Mod2.increase(); console.log(Mod1.num = ${Mod1.num}
)控制台会显示
使用简述
执行了上述demo后,快速体验了Node的原生
import/export
能力,那我们来讲讲目前的支持状况,Node 9.x官方文档 https://nodejs.org/dist/latest-v9.x/docs/api/esm.html与require()区别
import A from './a?v=2017'
*.js
,*.json
等直接支持*.mjs
,通过Loader Hooks
可以自定义配置规则支持*.js
,*.json
等Node原有支持文件Loader Hooks模式使用
Loader Hooks 使用步骤
node --experimental-modules --loader ./custom-loader.mjs ./index.js
如果觉得以下文字太长,可以先去玩玩对应的demo3 https://github.com/chenshenhai/node-modules-demo/tree/master/demo3
自定义规则快速上手
文件目录
加载自定义loader,执行
import/export
的*.js
文件自定义loader规则解析
以下是Node 9.2官方文档提供的一个自定义loader文件
规则总结
在自定义loader中,export的resolve规则最核心的代码是
esm
,cjs
,json
,builtin
,addon
这四种模块/文件格式.Koa2 直接使用import/export
看看demo4,https://github.com/chenshenhai/node-modules-demo/tree/master/demo4
代码片段太多,不一一贴出来,只显示主文件
执行代码
访问
自定义loader规则优化
从上面官方提供的自定义loader例子看出,只是对
*.js
文件做import/export
做loader兼容,然而我们在实际开发中需要对npm模块,*.json
文件也使用import/export
loader规则优化解析
后记
目前Node对
import/export
的支持现在还是Stability: 1 - Experimental
阶段,后续的发展还有很多不确定因素,自己练手玩玩还可以,但是在还没去flag使用之前,尽量不要在生产环境中使用。