ts的host.writeFile()第一个参数路径的分隔符为什么和我的系统不匹配?

在看ms库的源码
这里build.js文件中自定义了host.writeFile方法

function compile(files, options) {
  const compilerOptions = { ...config.compilerOptions, ...options }; 
  const host = ts.createCompilerHost(compilerOptions); 

  host.writeFile = (fileName, contents) => { 
    const isDts = fileName.endsWith('.d.ts');
    console.log(fileName.split(sep),sep) //[ 'src/index.js' ] \
    let path = join(DIR, fileName.split(sep)[1]);

注意看我上面的打印结果
我是win11系统,sep返回值是正确的,但是fileName传入的是src/index.js
这里是ts内部写死了这个分隔符吗?
这种情况下,我运行这个文件会直接报错,因为fileName.split('sep')[1]拿到的是undefined
当我修改成

    let path = join(DIR, fileName.split('/')[1]);

是可以正常运行的
源码位置
https://github.com/vercel/ms/blob/master/scripts/build.js

阅读 933
avatarAI BotBETA

这是因为在 Node.js 中,文件路径的分隔符是正斜杠(/),而在 Windows 中,路径分隔符是反斜杠(\)。这是由于 Windows 和 Unix 系统的差异导致的。在编写跨平台的代码时,常常需要考虑到这种差异。

在你的情况中,ts.createCompilerHost 创建的 host 对象是一个用于编译 TypeScript 代码的抽象主机表示。在 TypeScript 的实现中,它假设所有文件名都使用正斜杠,因为这是在编写 TypeScript 代码时默认的路径分隔符。

当你在 Windows 系统上运行代码时,你遇到的问题就是由于这个原因。你的文件名 'src/index.js' 在 Windows 上会被解析为 ['src', 'index.js'],而不是 ['src', 'index', 'js']。因此,当你尝试访问 fileName.split(sep)[1] 时,你实际上是在访问 undefined

为了解决这个问题,你可以使用 path.resolve 方法将路径解析为绝对路径。这将确保你的路径始终使用正斜杠,无论你的操作系统是什么。例如:

let path = join(DIR, path.resolve(fileName).split(sep)[1]);

此外,你提到的 join 函数可能是自定义函数或者是某个库的函数,我建议你检查一下它的实现以确保它能够正确处理不同系统的路径分隔符。

1 个回答

可能是兼容问题,用Node.js的path模块,path模块可以根据运行环境自动选对的分隔符:

const path = require('path');

function compile(files, options) {
  const compilerOptions = { ...config.compilerOptions, ...options };
  const host = ts.createCompilerHost(compilerOptions);

  host.writeFile = (fileName, contents) => {
    const isDts = fileName.endsWith('.d.ts');
    
    const normalizedFileName = path.normalize(fileName);
    
    // 用 path.join 来构建路径,会自动处理路径分隔符
    let outputPath = path.join(DIR, normalizedFileName);

    
    // 进行文件写入等操作
    // ...
  };

  // ...
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏