解决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 配置这三大方向,通常能快速找到突破口。

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

相关推荐
老华带你飞2 小时前
医疗保健|医疗养老|基于Java+vue的医疗保健系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·医疗保健
小飞大王6662 小时前
JavaScript基础知识总结(四):常见内置构造函数,正则表达式,作用域与闭包
前端·javascript·正则表达式
3秒一个大2 小时前
Ajax 数据请求详解:从概念到实战
javascript
Pu_Nine_92 小时前
Vue 3 项目 ESLint 配置详解:初始模板的正确配置
前端·javascript·vue.js
im_AMBER2 小时前
HTTP概述 01
javascript·网络·笔记·网络协议·学习·http
思茂信息3 小时前
CST电动车EMC仿真(二)——电机控制器MCU的EMC仿真
开发语言·javascript·单片机·嵌入式硬件·cst·电磁仿真
晴殇i3 小时前
前端极速性能优化:从加载到渲染的全链路实战指南
前端·javascript
AAA阿giao3 小时前
JavaScript 深拷贝全解析:从栈与堆内存机制到安全对象复制实践
前端·javascript·json
AAA阿giao3 小时前
深入理解 JavaScript 的 Array.prototype.map() 方法及其经典陷阱:从原理到面试实战
前端·javascript·面试