首先看puerts的官方文档
ESM 模块
从立即执行函数开始,Javascript 生态后续发展出过很多个模块规范,目前最流行的就是 JS 官方标准:ESM。
PuerTS 是支持执行 ESM 规范的模块的
官方是推荐esm的
好
怎么编译可以让ts编译成.mjs文件呢?
直接编译时改后缀吗?
当然不是
请看 TypeScript 4.7 的发布文档
package.json 中的 type 字段让我们仍可以使用 .ts 和 .js 作为文件后缀。
但是有时可能需要使用一些规范不同于 type 字段设置的文件,这时就需要特殊定义。
Node.js 支持两种扩展名支持这种情况:.mjs 和 .cjs。
无论 type 字段如何设置,.mjs文件始终被视为 ESM,而 .cjs 文件始终被视为 CommonJS。
相应的,TypeScript 支持两种新的源文件扩展名:.mts 和 .cts。
TypeScript 会将 .mts 文件转换为 .mjs,.cts 转换为 .cjs。
另外 TypeScript 也支持两种新的声明文件扩展名:.d.mts 和 .d.cts。
TypeScript 会为 .mts 文件生成 .d.mts 文件,为 .cts 文件生成 .d.cts。
使用这些扩展完全是可选的,但是即使你选择不将它们作为主要工作流的一部分,它们也常常是有用的。
也就是说 .ts 后缀改成 .mts 后缀就可以了
这时候再编译你会发现
导入会自动加mjs后缀了
import { Test } from "./Game/Test.mjs";
如果想 在调试unity的时候 编译ts代码
那么可以这样写
[InitializeOnEnterPlayMode]
public static void a()
{
string path = Path.Combine(Directory.GetCurrentDirectory(), "Assets", "src", "tsproj");
string root = Directory.GetDirectoryRoot(path);
var list = new List<string>();
list.Add(root[0] + ":");
list.Add("cd " + path);
list.Add("tsc");
string cmd = string.Join(" && ", list);
UnityEngine.Debug.Log("命令是:" + cmd);
Process p = new Process();
ProcessStartInfo _procStartInfo = new ProcessStartInfo("cmd.exe", @"/c " + cmd);
p.StartInfo = _procStartInfo;
_procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.Start();
p.Close();
UnityEngine.Debug.Log("编译tsc成功");
介绍下cmd的基础
aa && bb
means:执行aa,成功后再执行bb
ex:node a.js && node b.js
如果a.js运行失败则b.js不会再运行
aa || bb
means:先执行aa,若执行成功则不再执行bb,若失败则再执行bb
ex:node a.js || node b.js
如果a.js运行失败则b.js再运行,如果a.js运行成功则b.js不再运行
aa & bb
means:先执行aa再执行bb,无论aa是否成功
ex: node a.js & node b.js
先运行a.js运行,不管运行a.js文件是否报错,b.js接着运行
而在命令行里
/c 是执行完命令后关闭命令窗口
/k 是执行完命令后不关闭命令窗口
编译ts文件还有两个比较厉害的工具
swc和esbuild
esbuild 不能 编译目录 只能打包
swc 导出目录不太对
最后选择了tsc
不过tsc最慢
这个只能后续更新了
tsc可以增量编译和watch模式
自己选择吧
2023.3.7
最新版swc已经可以编译了 路径也正确了
不过必须使用 swcrc 配置文件
因为不用的话 编译any类型会报错
npx swc ./ts -d js --config-file swc.swcrc
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": false
},
"target": "es2022",
"loose": false,
"minify": {
"compress": false,
"mangle": false
}
},
"module": {
"type": "es6"
},
"minify": false,
"isModule": true
}
type 的 es6 其实就是 module 模式 不过因为这个模式是es6开启的 swc就叫es6了
但是swc又不能导出mjs文件。。我。。醉了