Unity Puerts TS编译的细节

首先看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文件。。我。。醉了

猜你喜欢

转载自blog.csdn.net/qq_38913715/article/details/128205330