async является защищенным ключевым словом. Когда вы используете async / await, вы можете пропустить пакет 'async'. Если вы правильно сделали ES6 + с модулями ECMAScript (ESM) , вы также переименовали все свои файлы * .mjs, например, index.mjs. Если у вас есть имя файла index.js, чаще всего предполагается, что он не является ESM. Вы должны добавить типы / интерфейсы ко всему своему коду ES6, поэтому, в зависимости от вашего случая, может оказаться невозможным сделать все сразу, поэтому я привожу пример в нотации ES2015 + ESM.
Для TypeScript вы должны быть в состоянии использовать ESM, потому что, я думаю, вы хотите более современную запись. Чтобы использовать асинхронность на верхнем уровне, для этого существует асинхронная функция . Пример кода для index.mjs, который включает ES2015 + импорт из ES5 / CommonJS * .js с module.exports и ESM импорт / экспорт и, наконец, динамический импорт:
import { createRequireFromPath } from 'module'; // ESM import
import { fileURLToPath } from 'url';
const require = createRequireFromPath(fileURLToPath(import.meta.url));
// const untypedAsync = require('async');
class Index {
constructor() {
this._server = null;
this.host = `localhost`;
this.port = 8080;
}
set server(value) { this._server = value; }
get server() { return this._server; }
async start() {
const http = await import(`http`); // dynamic import
this.server = http.createServer(this.handleRequest);
this.server.on(`error`, (err) => {
console.error(`start error:`, err);
});
this.server.on(`clientError`, (err, socket) => {
console.error(`start clientError:`, err);
if (socket.writable) {
return socket.end(`HTTP/1.1 400 Bad Request\r\n\r\n`);
}
socket.destroy();
});
this.server.on(`connection`, (socket) => {
const arrival = new Date().toJSON();
const ip = socket.remoteAddress;
const port = socket.localPort;
console.log(`Request from IP-Address ${ip} and source port ${port} at ${arrival}`);
});
this.server.listen(this.port, this.host, () => {
console.log(`http server listening at ${this.host}:${this.port}`);
});
}
handleRequest(req, res) {
console.log(`url:`, req.url);
res.setHeader(`Content-Type`, `application/json`);
res.writeHead(200);
res.end(JSON.stringify({ url: req.url }));
}
}
export default Index; // ESM export
export const randomName = new Index(); // Usage: import { randomName } from './index.mjs';
async function main() {
const index = new Index();
const cjs = require(`./otherfile.js`); // ES5/CommonJS import
console.log(`otherfile:`, cjs);
// 'async' can be used by using: cjs.untypedAsync
await index.start();
}
main();
// in otherfile.js
const untypedAsync = require('async');
const test = {
url: "url test",
title: "title test",
};
module.exports = { test, untypedAsync }; // ES5/CommonJS export.
Однако использование .mjs с машинописью в настоящее время имеет некоторые проблемы. Пожалуйста, посмотрите на связанные с этим проблемы с машинописью, которые все еще открыты: .mjs входные файлы и .mjs выходные файлы . Вы должны хотя бы перенести свои .ts в .mjs, чтобы решить ваши проблемы. Сценарии могут выглядеть следующим образом ( es6 для источника ):
// in package.json
"files": [ "dist" ],
"main": "dist/index",
"types": "dist/index.d.ts",
"scripts": {
"mjs": "tsc -d && mv dist/index.js dist/index.mjs",
"cjs": "tsc -m commonjs",
"start": "node --no-warnings --experimental-modules ./dist/index.mjs"
"build": "npm run mjs && npm run cjs"
},
"devDependencies": {
"typescript": "^3.2.2"
}
// in tsconfig.json
"compilerOptions": {
"module": "es2015",
"target": "ES2017",
"rootDir": "src",
"outDir": "dist",
"sourceMap": false,
"strict": true
}