解决Webpack 打包报错:TypeError: Cannot assign to read only property 'exports' ?

前言:

做前端项目打包时,你是否遇到过这样的窘境:本地 npm run dev 运行一切正常,可执行 npm run build 打包后,生产环境控制台直接抛出 TypeError: Cannot assign to read only property 'exports' of object '#<Object>' 错误?

一、背景介绍

最近有个以前的老项目(Vue2+webpack)在正式环境出现了问题,这个项目中途一直没改动,突然有个页面打不开了。在控制台的报错信息如下图所示:

需要说明的一点,这是打包后的报错,在本地运行的时候,是没有问题的。 我把这段报错信息复制下来,如果有需要的话可以复制去研究一下。

js 复制代码
vendor.0d88a535e3e863312d89.js:44 TypeError: Cannot assign to read only property 'exports' of object '#<Object>
    at Object.<anonymous> (0.d97ee341e9f7c8f3e805.js:1:14033)
    at 16Wf (0.d97ee341e9f7c8f3e805.js:1:16662)
    at n (manifest.83cbbf59a618d5d725c4.js:1:101)
    at Object.exjW (0.d97ee341e9f7c8f3e805.js:10:119646)
    at n (manifest.83cbbf59a618d5d725c4.js:1:101)
    at Object.OpaP (0.d97ee341e9f7c8f3e805.js:10:22333)
    at n (manifest.83cbbf59a618d5d725c4.js:1:101)
    at 7AuU (0.d97ee341e9f7c8f3e805.js:1:52095)
    at n (manifest.83cbbf59a618d5d725c4.js:1:101)
    at Object.sGS9 (0.d97ee341e9f7c8f3e805.js:10:181323)

二、解决方法

快速修复建议

  1. 首先尝试 方案一方案二 ,检查并修正 babelwebpack 配置。(推荐)
  2. 如果你知道具体哪个文件导致问题,直接修改该文件的模块语法。

下面将具体展开描述解决步骤:

  1. 我将这个问题的报错信息直接抛给了通义千问,让它帮我分析问题原因,并给出解决方案。

代码如下:

js 复制代码
{
  "presets": [
    ["env", {
      "modules": false,
      "targets": {
        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
      }
    }],
    "stage-2"
  ],
  "plugins": ["transform-runtime"]
}
  1. 对照着我自己的代码检查之后,确保项目根目录下的.babelrcbabel.config.js文件包含正确的配置,没有问题,(我项目中是.babelrc文件)。

    如果没有 .babelrc 文件,创建一个并添加上述内容。

  2. 然后继续看下一个方案:

代码如下:

js 复制代码
  module: {
    rules: [
      // 添加 JavaScript 文件处理规则来解决模块系统冲突问题
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /(node_modules|bower_components)/,
        options: {
          presets: [
            ['env', {
              modules: false // 确保设置为 false
            }]
          ]
        }
      }
    ]
  },

根据 方案二 ,找到项目中对应的 build/webpack.prod.conf.js文件,看是否有上面的这段代码。

下图是我的项目中的代码,很尴尬,没有这部分代码......

  1. 接着就可以将这部分代码加进去:

代码如下,可直接复制:

js 复制代码
  module: {
    rules: [
      // 添加 JavaScript 文件处理规则来解决模块系统冲突问题
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /(node_modules|bower_components)/,
        options: {
          presets: [
            ['env', {
              modules: false
            }]
          ]
        }
      },
      // 保留原有的样式处理规则
      ...utils.styleLoaders({
        sourceMap: config.build.productionSourceMap,
        extract: true
      })
    ]
  },

关键点是设置 "modules": false,这告诉 Babel 不要转换 ES6 的 import/export 语法,让 webpack 来处理模块系统,避免 ES6 模块语法和 CommonJS 语法冲突的问题。

完成这些修改后,重新运行 npm run build 应该就能解决你遇到的错误了。

推荐这个方案的原因是,这样可以确保开发环境和生产环境使用相同的 babel 配置。这个修改就是我成功解决问题的方法。

  1. AI 还给我建议说,"检查具体出错的文件",可是根据错误堆栈,问题出现的文件名称是被编译过的,找的话就需要查找源代码中混用了 importmodule.exports 的地方,找到之后统一使用一种模块语法即可。 由于我的出错文件是在第三方库中,所以这个方案有点麻烦,我果断放弃。

三、问题原因

核心原因正如分析所示:在同一模块中同时混用了 ES6 的 import/export 语法与 CommonJS 的 module.exports 语法,导致 webpack 处理模块时出现冲突。这是 webpack 打包后,生产环境中较为常见的问题。

如果是自己写的代码,可以在代码中查找并修改,统一项目中的模块语法规范即可。如果是第三方库出现的问题,就可以用本文中的方法解决,先尝试检查 babel 配置并确保 modules: false 设置正确,这通常能解决大部分此类问题。

四、总结

前端打包报错往往 "现象复杂,根源简单",遇到类似问题时,优先排查模块语法、依赖兼容性、Webpack 配置这三大方向,通常能快速找到突破口。

以上,希望对大家有帮助!

相关推荐
TT哇18 分钟前
【实习 】银行经理端两个核心功能的开发与修复(银行经理绑定逻辑修复和线下领取扫码功能开发)
java·vue.js
星光不问赶路人2 小时前
vue3使用jsx语法详解
前端·vue.js
Mr Xu_2 小时前
Vue 3 中计算属性的最佳实践:提升可读性、可维护性与性能
前端·javascript
子兮曰2 小时前
深入理解滑块验证码:那些你不知道的防破解机制
前端·javascript·canvas
Highcharts.js2 小时前
【Highcharts】如何用命令行渲染导出图片?
javascript·导出·开发文档·highcharts·命令行渲染·命令行功能
weixin79893765432...2 小时前
Vue 组件的更新过程(编译系统 + 响应式系统 + 虚拟 DOM & Diff)
vue.js
陈振wx:zchen20083 小时前
JavaScript
javascript·js
我是伪码农3 小时前
Vue 智慧商城项目
前端·javascript·vue.js
不认输的西瓜3 小时前
fetch-event-source源码解读
前端·javascript
小书包酱4 小时前
在 VS Code中,vue2-vuex 使用终于有体验感增强的插件了。
vue.js·vuex