Javascript 如何对ES6模块中的功能进行分组?
如何将ES6模块包中的功能分组?在CommonJS包中,您可以这样做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
// 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应该有“模块”,谢谢。这就是我要找的。我以前接触过所有的设置,但并没有完全正确。你把我推向了正确的方向。现在我的代码看起来会更好。