Что эквивалентно module.exports для модулей ES6? - PullRequest
2 голосов
/ 07 апреля 2020

У меня есть существующий пакет, написанный на JavaScript, который я пытаюсь преобразовать в TypeScript. Мой вопрос, что эквивалентно module.exports для модулей ES6?

Например, если у меня есть следующий код:

module.exports = function () {
    console.log("Hello World");
};

Единственный способ, которым я нашел это сделать в Модули ES делают что-то вроде следующего.

const myFunc = function () {
    console.log("Hello World");
};
export default myFunc;
// OR
export { myFunc };

Конечно, это не то же самое, что module.exports = //....

, что приводит к этой проблеме. Когда я запускаю это через TypeScript и получаю выведенный код, пользователям пакета либо потребуется использовать оператор import defaultExport from "module-name"; (что неплохо), либо вместо возможности доступа к нему с помощью require("module-name") им придется используйте require("module-name").default (если они используют стандартный JS, а не TypeScript). Что, очевидно, является прорывным изменением API для стандартных JavaScript пользователей.

Очевидно, что цель здесь состоит в том, чтобы не нарушать API-изменения (и не требовать никаких изменений для кода клиента).


Еще одно требование к любому решению. В других местах пакета мне нужно иметь возможность экспортировать много разных файлов как один объект. Так в прошлом я делал:

module.exports = {
    "thing1": require("./a.js"),
    "thing2": require("./b.js")
};

Так что мне нужно иметь возможность экспортировать это как обычно, не требуя от пользователя выполнения thing1.default. Это пока что кажется более простым требованием, так как я экспортирую объект, который ES Modules, кажется, обрабатывает очень хорошо. Когда вы экспортируете единственное (неименованное) выражение, оно становится действительно сложным.


Есть ли способ сделать это без необходимости вносить в API критические изменения?

Ответы [ 3 ]

0 голосов
/ 07 апреля 2020

Решением здесь является использование команды TypeScript export =. Это позволяет вам использовать require или import с модулем.

export = function () {
    console.log("Hello World");
};
import myModule from "./lib/myModule";

// OR

const myModule = require("./lib/myModule");

Для получения дополнительной информации в документации TypeScript есть руководство по Миграция с JavaScript и, в частности, раздел под названием Экспорт из модулей .

0 голосов
/ 07 апреля 2020

Наиболее точная замена для module.exports в машинописи - export default

export default {
    "thing1": require("./a.js"),
    "thing2": require("./b.js")
}

, тогда вы можете использовать их, как показано ниже

import myThings from '.....'
0 голосов
/ 07 апреля 2020

Typescript рекомендует не переписывать ваш код, а вместо этого настроить его так, чтобы он разрешал js модули.

Когда мы работали над преобразованием очень большого приложения из js в TS, мы заняли позицию написания нового кода в TS и медленно конвертировали js в ts (но не тратили много время просто конвертируется).

Нам нужно было включить несколько параметров в tsconfig. json, таких как:

{
  ...,
  "compilerOptions" : {
    ... 
    "moduleResolution": "node",
    "allowJs": true,
    ...
  },
  "include" [
    "path/to/my/js",
  ]
}

, вам также необходимо обновить webpack.config.js:

module.exports = {
   // ... my settings


   resolve: {
        // Add '.ts' and '.tsx' as resolvable extensions.
        extensions: ["", ".webpack.js", ".web.js", ".ts", ".tsx", ".js"]
    },
}

Возможно, вам также придется объявить require как функцию (если вы получаете такие ошибки, как require is undefined):

declare function require(path: string): any;

дополнительная информация доступна здесь: https://www.typescriptlang.org/docs/handbook/migrating-from-javascript.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...