【发布时间】:2021-03-25 20:54:37
【问题描述】:
如何在 ES6 模块包中对函数进行分组?在 CommonJS 包中你可以这样做。
// package.js
const startSession = require("./startSession");
module.exports = {
hooks: {
startSession,
},
};
// client.js
const { hooks: {startSession } } = require("package");
// OR
const { startSession } = require("package").hooks;
似乎不支持 ES6 代码中的类似语法。
import { hooks: {startSession } } from "packageX";
在源头上,这是 2016 年的 babel 问题。https://github.com/babel/babel/issues/4996
另一个是官方文档,并没有真正提到这种语法。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
解决方案
ES6 javascript 中的一个解决方案是这样的。
// package.js
import startSession from "./hooks/start-session";
export const hooks = {
startSession
};
// client.js
import { hooks } from "package";
const { startSession } = hooks;
但我想将导入写在一行中。也许不可能?
这不是我想要的。
import { hooks } from "package"; const { startSession } = hooks;
这种语法会很好,但是如果可能的话,你如何设置包?
import { startSession } from "packageX/hooks";
import { startSession } from "packageX".hooks;
还有其他建议吗?
回答
下面的埃斯图斯把我推向了正确的方向。这是一个更详细的答案。
// package.json
"main": "src/index.js",
"exports": {
".": "./src/index.js",
"./hooks": "./src/hooks/index.js",
}
// src/hooks/start-session.js
export default () => {}
// src/hooks/index.js
export * as startSession from "./start-session";
// src/index.js
export const doSomething () => {}
// client.js
import { doSomething } from "packageX";
import { startSession } from "packageX/hooks";
【问题讨论】:
-
如果你想像
from 'packageX/hooks'一样导入它,创建一个名为hooks的子目录,并在其中创建一个名为index.js的文件,其中包含export startSession。 -
你甚至可以有一个带有嵌套 package.json 的 hooks 目录,它引用了 hooks 之外的主文件,因此嵌套入口点不会定义模块的结构。
标签: javascript node.js ecmascript-6 es6-modules