web-infra-dev / rspack

The fast Rust-based web bundler with webpack-compatible API 🦀️
https://rspack.dev
MIT License
9.54k stars 552 forks source link

[Bug]: Rspack does not rebuild when modifying pure type files #7957

Open noshower opened 4 weeks ago

noshower commented 4 weeks ago

System Info

  System:
    OS: macOS 14.5
    CPU: (16) x64 Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
    Memory: 125.49 MB / 32.00 GB
    Shell: 5.9 - /bin/zsh
  Binaries:
    Node: 20.12.0 - ~/.nvm/versions/node/v20.12.0/bin/node
    Yarn: 1.22.22 - ~/.nvm/versions/node/v20.12.0/bin/yarn
    npm: 10.5.0 - ~/.nvm/versions/node/v20.12.0/bin/npm
    pnpm: 9.5.0 - ~/.nvm/versions/node/v20.12.0/bin/pnpm
  Browsers:
    Chrome: 129.0.6668.59
    Safari: 17.5
  npmPackages:
    @rspack/cli: 0.7.5 => 0.7.5 
    @rspack/core: 0.7.5 => 0.7.5 
    @rspack/plugin-react-refresh: 0.7.5 => 0.7.5 

Details

修改纯类型的文件时,rspack 没有编译,导致 tsconfig-paths-webpack-plugin 插件反应。

Reproduce link

No response

Reproduce Steps

下面是可复现的demo: rspack-project.zip

复现步骤

  1. 启动项目 npm run dev
  2. 启动完项目后修改 src/type.ts , 将 "Android" 删除, 保存文件

预期

终端中显示错误

ERROR in ./src/App.tsx:9:51
TS2345: Argument of type '"Android"' is not assignable to parameter of type 'AppType | (() => AppType)'.
     7 |   const [count, setCount] = useState(0);
     8 |
  >  9 |   const [appType, setAppType] = useState<AppType>("Android");
       |                                                   ^^^^^^^^^
    10 |
    11 |   console.log(appType, setAppType);
    12 |

Found 1 error in NaN ms.

实际

没有任何反应。

其他说明

在 0.5.6 版本中,不管是纯类型的 .d.ts 还是 .ts 文件,在保存文件后,都会触发类型检查。升级到 0.7.5 之后,纯类型文件,只会在首次启动时才参与类型检查,后面再修改,仿佛就没有修改似得。

另外我们从 webpack 迁移到 rspack ,项目架构没有变化,webpack 和 rspack@0.5.6 都是可以在文件修改后,触发类型检查。

期望,尽快修复这个问题,我们项目中每个组件都可能存在一个 type.ts(会被其他文件引用) 这样的纯类型文件和全局的 .d.ts(不会被其他文件引用,全局的) 文件。目前类型检查不工作,毕竟影响工作效率。

辛苦研发大哥们,早点修复。☕️

noshower commented 4 weeks ago

这个问题,在 1.0.x 中也是存在的

noshower commented 2 days ago

嘿,这个问题什么时候安排修复

inottn commented 2 days ago

You can try using this plugin code as a temporary fix for the issue.

class Plugin {
  apply(compiler) {
    compiler.hooks.afterCompile.tapPromise('delay', async () => {
      await new Promise((r) => {
        setTimeout(r, 10);
      });
    });
  }
}
jerrykingxyz commented 22 hours ago

从提供的 demo 上看,因为 builtin:swc-loader 在转换代码时将 type.ts 的 import 给移除了导致 type.ts 没有被监听。目前可以直接把 type.ts 加入到 file_dependencies 中来解决。


From the provided demo, it seems that type.ts is not monitored because builtin:swc-loader removes the import of type.ts when converting the code. Currently, you can directly add type.ts to file_dependencies to solve this problem.

class MyPlugin {
    apply(compiler) {
        compiler.hooks.compilation.tap("MyPlugin", (compilation) => {
            compilation.fileDependencies.add(path.resolve(__dirname, "./src/type.ts"))
        })
    }
}