首先,我对此很陌生,但我很难尝试在节点中设置项目。
该项目应该运行一个 graphql 服务器作为后端(在 docker 容器中运行)
我还尝试通过热重载来设置它,以便于开发。
我使用以下步骤创建了一个项目:
(一些附加信息: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 文件中使用 graphqlimport { 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 不能很好地协同工作?在这种情况下,还有另一个设置热重载的选项吗?
谢谢!
根据评论中的建议,我在这里发布了一个可能的替代方案。
使用 tsx 有一种更简单的方法可以使其发挥作用。 (https://github.com/esbuild-kit/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”运行代码并观察更改。