【问题标题】:How do I group functions in ES6 Modules?如何在 ES6 模块中对函数进行分组?
【发布时间】: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


【解决方案1】:

ES 模块应该被静态分析,因此由表达式产生的嵌套导入是不可能的。导入语法不是解构的,只是看起来相似。是strictly specified;如果某项功能不存在,则不支持。

最好避免这种情况,因为这会防止 hooks 属性被树抖动(目前不适用于 Node)。

对于入口点或桶模块,前缀可用于为导出提供范围:

export { default as hookStartSession } from "./hooks/start-session";

这是一种通常在导入具有一定范围时执行的方式,至少在包公开额外的公共入口点的情况下。

import { startSession } from "packageX/hooks"

【讨论】:

  • 这可能是我正在寻找的。我通常将我的代码放在 /src 中,并在我的 package.json 中有“main”:“src”。但是有了这个解决方案,看起来我需要将 hooks 文件夹放在我的项目根目录中。这个可以从 package.json 配置吗?
  • 这取决于您是针对转译模块还是本机模块。对于 CJS,你需要有 'main' 指向入口点的虚拟 hooks/package.json。对于原生 ESM 不需要这个,根 package.json 应该有 'modules',nodejs.org/api/packages.html#packages_package_entry_points
  • 谢谢。这就是我要找的。我之前已经接触过所有设置,但并没有真正做到正确。你完全把我推向了正确的方向。现在我的代码看起来会好很多。
猜你喜欢
  • 2010-11-16
  • 2015-03-11
  • 2015-07-19
  • 2019-04-04
  • 2015-08-04
  • 2021-05-10
  • 2013-01-31
  • 1970-01-01
  • 2016-04-02
相关资源
最近更新 更多