не может требовать экспортируемую по умолчанию функцию из файла машинописи в nodejs - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь создать пакет npm в машинописи. Я не могу требовать и использовать функцию по умолчанию, экспортированную в модуле машинописи. Я попытался изменить параметры модуля в tsconfig.json на UMD и AMD, но не повезло.

//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.

1 Ответ

1 голос
/ 07 марта 2020

Проблема в том, что вы смешиваете синтаксис модуля. Когда вы используете 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, и соответственно деструктурировать ее.

...