You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vite构建报错[commonjs--resolver]:无法解析包入口求解决方案

解决Vite构建时第三方包入口路径错误的问题

问题场景

我项目中node_modules里的某个包的package.json配置如下:

{
  "sideEffects": false,
  "module": "./index.js",
  "main": "../node/{moduleName}/index.js",
  "types": "./index.d.ts"
}

使用Vite构建时抛出以下错误:

[commonjs--resolver] Failed to resolve entry for package "/drone/src/node_modules/{module}/core/node_modules/@mui/material/LinearProgress". The package may have incorrect main/module/exports specified in its package.json: ENOENT: no such file or directory, lstat '/drone/src/node_modules/{module}/core/node_modules/@mui/material/LinearProgress/index.js'
error during build:

我的Vite配置文件内容:

import { defineConfig } from 'vite';
import RubyPlugin from 'vite-plugin-ruby';

export default defineConfig({
  build: {
    assetsInlineLimit: 2048,
    rollupOptions: {
      external: ['react', 'react-dom'],
      output:{
        globals: {
          react: 'React',
          'react-dom': 'ReactDom'
        },
        manualChunks(id) {
          if (id.includes('node_modules')) {
            return id.toString().split('node_modules/')[1].split('/')[0].toString();
          }
        }
      }
    }
  },
  plugins: [RubyPlugin()],
});

由于无法修改该第三方包的package.json,需要找到替代方案解决这个构建错误。

解决方案

方法1:用Vite的resolve.alias强制映射正确入口

直接给有问题的包配置别名,指定它实际存在的文件路径。假设该包的正确入口是./dist/index.js(根据你的项目实际路径调整),修改Vite配置:

import { defineConfig } from 'vite';
import RubyPlugin from 'vite-plugin-ruby';
import path from 'path';

export default defineConfig({
  resolve: {
    alias: {
      // 替换成实际有问题的包名和正确的文件路径
      '@mui/material/LinearProgress': path.resolve(
        __dirname,
        'node_modules/{module}/core/node_modules/@mui/material/LinearProgress/dist/index.js'
      ),
    },
  },
  build: {
    assetsInlineLimit: 2048,
    rollupOptions: {
      external: ['react', 'react-dom'],
      output:{
        globals: {
          react: 'React',
          'react-dom': 'ReactDom'
        },
        manualChunks(id) {
          if (id.includes('node_modules')) {
            return id.toString().split('node_modules/')[1].split('/')[0].toString();
          }
        }
      }
    }
  },
  plugins: [RubyPlugin()],
});

方法2:调整resolve.mainFields优先级

如果这个包的module字段路径是正确的,直接让Vite优先读取module字段而非错误的main字段。修改配置:

import { defineConfig } from 'vite';
import RubyPlugin from 'vite-plugin-ruby';

export default defineConfig({
  resolve: {
    // 优先使用module字段,再读取main
    mainFields: ['module', 'main'],
  },
  build: {
    assetsInlineLimit: 2048,
    rollupOptions: {
      external: ['react', 'react-dom'],
      output:{
        globals: {
          react: 'React',
          'react-dom': 'ReactDom'
        },
        manualChunks(id) {
          if (id.includes('node_modules')) {
            return id.toString().split('node_modules/')[1].split('/')[0].toString();
          }
        }
      }
    }
  },
  plugins: [RubyPlugin()],
});

方法3:用Rollup插件动态修正package.json

写个自定义Rollup插件,在构建过程中临时修正目标包的package.json内容,不需要修改本地文件:

import { defineConfig } from 'vite';
import RubyPlugin from 'vite-plugin-ruby';
import fs from 'fs';
import path from 'path';

// 自定义插件:动态修正目标包的package.json
function fixPackageJson() {
  return {
    name: 'fix-package-json',
    async resolveId(source) {
      if (source.includes('@mui/material/LinearProgress')) {
        const pkgPath = path.resolve(
          __dirname,
          'node_modules/{module}/core/node_modules/@mui/material/LinearProgress/package.json'
        );
        const pkgContent = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
        // 把main字段修正为正确的路径
        pkgContent.main = './index.js'; // 替换成实际正确的路径
        // 临时生成修正后的package.json到构建流程中
        this.emitFile({
          type: 'asset',
          fileName: 'node_modules/@mui/material/LinearProgress/package.json',
          source: JSON.stringify(pkgContent, null, 2),
        });
      }
    },
  };
}

export default defineConfig({
  plugins: [RubyPlugin(), fixPackageJson()],
  build: {
    assetsInlineLimit: 2048,
    rollupOptions: {
      external: ['react', 'react-dom'],
      output:{
        globals: {
          react: 'React',
          'react-dom': 'ReactDom'
        },
        manualChunks(id) {
          if (id.includes('node_modules')) {
            return id.toString().split('node_modules/')[1].split('/')[0].toString();
          }
        }
      }
    }
  },
});

内容的提问来源于stack exchange,提问作者Hakob Sargsyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:10:32