如何告诉(webpack)编译器转换依赖项目的tsconfig路径

iyr7buue  于 2023-11-19  发布在  Webpack
关注(0)|答案(1)|浏览(151)

假设有一个monorepo工作区。monorepo有一个应用子工作区(/workspace/app)和一个组件子工作区(/workspace/component)。为了开发启用热模块重载的应用和组件库,在应用子工作区的tsconfig中,我们可以使用路径配置:

  1. { // /workspace/app/tsconfig.json
  2. "compilerOptions": {
  3. "paths": {
  4. "@lib/component": ["../component"]
  5. }
  6. }
  7. }

字符串
现在,在组件子工作区的tsconfig中,可能有其他路径:

  1. { // /workspace/component/tsconfig.json
  2. "compilerOptions": {
  3. "paths": {
  4. "@/*": ["./src/*"]
  5. }
  6. }
  7. }


要么/workspace/component/tsconfig.json被webpack忽略,要么路径@/*没有被webpack正确处理,结果是从@/xxx导入的/workspace/component/src中的代码没有被正确理解,因此应用程序无法编译。
当每个子工作区被独立地编译为js时,我知道带有typescript-transform-paths插件的ts-patch能够将@/xxx导入路径转换为相对于子工作区根的正确相对路径。
现在,当直接使用webpack来处理所有这些子组件时,什么是正确的配置来转换它们?
参考/示例:next.js/webpack:https://github.com/belgattitude/nextjs-monorepo-example/discussions/4555

isr3a4wc

isr3a4wc1#

我写了一个类似于https://github.com/dividab/tsconfig-paths-webpack-plugin/blob/master/src/plugin.ts的webpack插件
它拦截webpack的解析器(内部使用enhanced-resolve),如果根路径是另一个子工作区,它将搜索tsconfig文件,然后解析路径。
要启用:

  1. // next.config.mjs
  2. import { MonorepoResolvePlugin } from './monorepo-resolve-plugin.mjs';
  3. const nextConfig = {
  4. webpack: (config) => {
  5. // ...other codes
  6. config.resolve = {
  7. ...config.resolve,
  8. plugins: [
  9. ...config.resolve.plugins,
  10. new MonorepoResolvePlugin({
  11. appRoot: process.cwd(),
  12. workspaceParents: [
  13. '../../apps',
  14. '/workspaces/nextjs-monorepo-example/packages/',
  15. ],
  16. }),
  17. ],
  18. };
  19. }
  20. };

个字符

展开查看全部

相关问题