Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何对ES6模块中的功能进行分组?_Javascript_Node.js_Ecmascript 6_Es6 Modules - Fatal编程技术网

Javascript 如何对ES6模块中的功能进行分组?

Javascript 如何对ES6模块中的功能进行分组?,javascript,node.js,ecmascript-6,es6-modules,Javascript,Node.js,Ecmascript 6,Es6 Modules,如何将ES6模块包中的功能分组?在CommonJS包中,您可以这样做 // package.js const startSession = require("./startSession"); module.exports = { hooks: { startSession, }, }; // client.js const { hooks: {startSession } } = require("package"); // OR

如何将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年发行的巴别塔

另一个是官方文档,它没有真正提到这种语法。

解决方案

ES6JavaScript中的一个解决方案是这样的

// package.js
import startSession from "./hooks/start-session";
export const hooks = {
  startSession
};

// client.js
import { hooks } from "package";
const { startSession } = hooks;
但是我想把导入写在一行中。也许不可能

import { startSession } from "packageX/hooks";
import { startSession } from "packageX".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";

ES模块应该是静态分析的,因此从表达式生成的嵌套导入是不可能的。导入语法不是解构,只是看起来类似。它是;如果功能不存在,则不支持该功能

import { hooks: {startSession } } from "packageX";
最好避免这种情况,因为这样可以防止
钩子
属性受到树震动(目前不适用于节点)

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

export { default as hookStartSession } from "./hooks/start-session";
这是一种通常在导入具有某些作用域时执行的方法,至少在包公开额外的公共入口点时是如此

import { startSession } from "packageX/hooks"

如果要像从“packageX/hooks”导入代码一样导入它,创建一个名为
hooks
的子目录,并创建一个名为
index.js
的文件,其中包含
export startSession
。您甚至可以让hooks dir和嵌套的package.json在内部引用hooks外部的主文件,这样嵌套的入口点就不会定义模块的结构。这可能就是我正在寻找的。我通常将代码放在/src中,在package.json中有“main”:“src”。但是有了这个解决方案,看起来我需要将hooks文件夹放在我的项目根目录中。这可以从package.json配置吗?这取决于您的目标是传输模块还是本机模块。对于CJS,您需要具有虚拟hooks/package.json,其中包含指向入口点的“main”。对于本机ESM,不需要这样做,root package.json应该有“模块”,谢谢。这就是我要找的。我以前接触过所有的设置,但并没有完全正确。你把我推向了正确的方向。现在我的代码看起来会更好。