/app/src/index.ts 与 nodemon 结合使用时启动节点应用程序的未知文件扩展名“.ts”

问题描述 投票:0回答:1

首先,我对此很陌生,但我很难尝试在节点中设置项目。

该项目应该运行一个 graphql 服务器作为后端(在 docker 容器中运行)

我还尝试通过热重载来设置它,以便于开发。

我使用以下步骤创建了一个项目:

  • npm 初始化 -y
  • npm install -D 打字稿
  • npm 安装 ts-node
  • npm 安装nodemon
  • npm 安装@apollo/server graphql
  • npx tsc --init

(一些附加信息:npm 9.8.1,节点 v20.6.0)

我创建了一个你好世界,其中:

索引.ts

let message: string = 'Hello, World!';
console.log(message);

package.json

{
  "name": "app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "tsc",
    "dev": "nodemon src/index.ts",
    "start": "node dist/index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/node": "^20.6.1",
    "typescript": "^5.2.2"
  },
  "dependencies": {
    "@apollo/server": "^4.9.3",
    "graphql": "^16.8.0",
    "nodemon": "^3.0.1",
    "ts-node": "^10.9.1"
  }
}

tsconfig.json

{
  "compilerOptions": {
    "rootDirs": ["src"],
    "outDir": "dist",
    "target": "es2020",
    "module": "esnext",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true,
    "lib": ["es2020"],
    "moduleResolution": "node",
    "types": ["node"]
  }
}

到目前为止一切顺利,当我运行“npm run dev”时它可以工作并且得到以下结果:

/app $ npm run dev

> [email protected] dev
> nodemon src/index.ts

[nodemon] 3.0.1
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: ts,json
[nodemon] starting `ts-node src/index.ts`
Hello, World!
[nodemon] clean exit - waiting for changes before restart

现在乐趣开始了:-),我尝试通过添加

在我的 index.ts 文件中使用 graphql
import { ApolloServer } from '@apollo/server';
import { startStandaloneServer } from '@apollo/server/standalone';


let message: string = 'Hello, World!';
console.log(message);

nodemon 接受更改并重新加载,但抛出异常:

nodemon] starting `ts-node src/index.ts`
(node:993) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/app/src/index.ts:3
export {};
^^^^^^

SyntaxError: Unexpected token 'export'
    at internalCompileFunction (node:internal/vm:73:18)
    at wrapSafe (node:internal/modules/cjs/loader:1153:20)
    at Module._compile (node:internal/modules/cjs/loader:1205:27)
    at Module.m._compile (/app/node_modules/ts-node/src/index.ts:1618:23)
    at Module._extensions..js (node:internal/modules/cjs/loader:1295:10)
    at Object.require.extensions.<computed> [as .ts] (/app/node_modules/ts-node/src/index.ts:1621:12)
    at Module.load (node:internal/modules/cjs/loader:1091:32)
    at Function.Module._load (node:internal/modules/cjs/loader:938:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:83:12)
    at phase4 (/app/node_modules/ts-node/src/bin.ts:649:14)

不用担心,我只需将 "type": "module" 添加到 package.json ...

但运气不好,现在我得到以下异常:

[nodemon] restarting due to changes...
[nodemon] starting `ts-node src/index.ts`
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /app/src/index.ts
    at new NodeError (node:internal/errors:405:5)
    at Object.getFileProtocolModuleFormat [as file:] (node:internal/modules/esm/get_format:99:9)
    at defaultGetFormat (node:internal/modules/esm/get_format:142:36)
    at defaultLoad (node:internal/modules/esm/load:115:20)
    at ModuleLoader.load (node:internal/modules/esm/loader:388:13)
    at ModuleLoader.moduleProvider (node:internal/modules/esm/loader:270:56)
    at new ModuleJob (node:internal/modules/esm/module_job:65:26)
    at ModuleLoader.#createModuleJob (node:internal/modules/esm/loader:282:17)
    at ModuleLoader.getJobFromResolveResult (node:internal/modules/esm/loader:240:34)
    at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:221:17) {
  code: 'ERR_UNKNOWN_FILE_EXTENSION'

有人能看出问题出在哪里吗?

也许nodemon 和graphql 不能很好地协同工作?在这种情况下,还有另一个设置热重载的选项吗?

谢谢!

node.js typescript nodemon
1个回答
0
投票

根据评论中的建议,我在这里发布了一个可能的替代方案。

使用 tsx 有一种更简单的方法可以使其发挥作用。 (https://github.com/esbuild-kit/tsx

  • npm 初始化 -y
  • npm install --save-dev typescript @types/node
  • npm install --global tsx

package.json

{
  "name": "app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "tsx watch ./src/index.ts"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "tsx": "^3.12.10"
  },
  "dependencies": {
    "@apollo/server": "^4.9.3",
    "graphql": "^16.8.0"
  }
}

和“npm start”运行代码并观察更改。

© www.soinside.com 2019 - 2024. All rights reserved.