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

作者站长头像
站长
· 阅读数 7

在看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

回复
1个回答
avatar
test
2024-06-24

可能是兼容问题,用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);

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

  // ...
}
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容