【问题标题】:not able to require default exported function from typescript file in nodejs无法从 nodejs 中的 typescript 文件中要求默认导出函数
【发布时间】:2020-03-07 12:54:51
【问题描述】:

我正在尝试在 typescript 中构建一个 npm 包。 我无法要求和使用 typescript 模块中导出的默认函数。我尝试将tsconfig.json 中的模块选项更改为UMDAMD,但没有成功。

//index.ts
export default function () {
  console.log("greet");
}

export function greet2() {
  console.log("greet2");
}
//tsconfig.json
{

  "compilerOptions": {
    "target": "es5",
    "module": "commonJS",
    "declaration": true,
    "outDir": "./lib",
    "strict": true
  }
}
//index.js
const greet = require("./lib/index");

greet();

greet.greet2();
//console
greet();
^

TypeError: greet is not a function

Webpack 可以用于解决方案,但我想知道是否有任何方法可以不使用 Webpack。

【问题讨论】:

  • 你的 webpack 将所有的 js 文件编译成压缩包文件。 index.js 等单独的文件不会直接添加到此文件中。它们可能有一些不同的名称,带有从 webpack 对象获取的系统前缀。这意味着您的 ts 模块被封装在包对象中,并且假设仅在此命名空间内使用。
  • 很抱歉我现在没有使用webpack,我想知道是否有任何解决方案只使用tsc而不使用webpack。
  • 在这种情况下,您需要额外的库来读取require 方法并手动将所有已编译的 js 脚本添加到您的网页。这是一种有点复杂和不寻常的方式,但有时可能很有用。
  • 猜猜我会需要 webpack。谢谢你。我确实在这里找到了解决方案stackoverflow.com/questions/56402067/… 但如果我这样做,我将无法进行命名导出。

标签: javascript typescript commonjs


【解决方案1】:

问题在于您正在混合模块语法。当您使用 require 时,您将返回一个具有 default 属性和 greet2 属性的对象。

require 假设您知道导出的结构,因为它们几乎可以是您使用module.exports = anything 指定的任何形状,而另一方面,ES 模块具有严格的规范。这允许导入呈现来自导出的形状,并可以方便地为您解构它。

目前如果你记录它,greet 变量将是一个像这样的对象:

Object {default: function _default(), greet2: function greet2()}

这当然不是函数,因此是错误。

如果改为使用导入语法

import greet from './lib/index';

它会编译成相当于:

const greet = require('./lib/index').default;

您当然可以用同样的方式使用 require 自己,您只需要了解从 require 返回的任何内容的形状并相应地对其进行解构。

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 2020-05-22
    • 2020-04-30
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多