记录一下,学习typescript的坑 1 -- 模块化混用的冲突

206 阅读2分钟

报错提示

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /Users/srg/Documents/WebStormProject/study-note-vite-ts/src/ts/enums.ts
    at new NodeError (node:internal/errors:405:5)
    at Object.getFileProtocolModuleFormat [as file:] (node:internal/modules/esm/get_format:136:11)
    at defaultGetFormat (node:internal/modules/esm/get_format:182:36)
    at defaultLoad (node:internal/modules/esm/load:101:20)
    at ModuleLoader.load (node:internal/modules/esm/loader:417:13)
    at ModuleLoader.moduleProvider (node:internal/modules/esm/loader:288:22)
    at new ModuleJob (node:internal/modules/esm/module_job:63:26)
    at ModuleLoader.#createModuleJob (node:internal/modules/esm/loader:312:17)
    at ModuleLoader.getJobFromResolveResult (node:internal/modules/esm/loader:265:34)
    at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:251:17) {
  code: 'ERR_UNKNOWN_FILE_EXTENSION'
  

这边在最近使用了vite + ts + vue3搭建一个项目,来学习Typescript。但是,在使用npm 全局安装好了 typescript以及ts-node 后,使用tsc 命令,进行相应的编译没有任何问题,但是,使用对应的ts-node来直接运行ts格式的文件时,会报出这个错误。

错误原因分析

项目的根目录下,设置了type:module,在 node 支持 ES 模块后,要求 ES 模块采用 .mjs 后缀文件名。只要遇到 .mjs 文件,就认为它是 ES 模块。如果不想修改文件后缀,就可以在 package.json文件中,指定 type 字段为 module。这样所有 .js 后缀的文件,node 都会用 ES 模块解释。如果还要使用 CommonJS 模块规范,那么需要将 CommonJS 脚本的后缀名都改成.cjs,不过两种模块规范最好不要混用,会产生异常报错。

"type": "module"

typyscript 文件是需要编译成js,才能执行,这里在使用ts-node时,实际上相当于运行了tsc + node。

# Execute a script as `node` + `tsc`.
ts-node script.ts

这边的话,可以将package.json中的type的设置删除掉,之后,再使用ts-node来执行 ts格式的文件就能够正常执行了。