Cannot assign to read only property 'exports' of object 报错

Cannot assign to read only property ‘exports’ of object '#< Object>'报错

原因:

在 webpack 中不允许混用 import 和 module.exports

有时候我们vue的项目,每个页面会有这样的目录结构:

在这里插入图片描述

会有一个index.js文件用来导出该页面:在这里插入图片描述
这里面就会有 module.exports,当我们用webpack打包时,这两种就会混用而报错

解决:

  1. 改成用import和export default配合来使用

  2. 在 babel.config.js 文件加入以下配置:

module.exports = {
	presets: [
	    '@vue/app'
	],
	sourceType: 'unambiguous'   // 此配置
}

此配置可以让babel和webpack一样严格区分commonJS文件和ES6文件

原理:

首先要了解 require 和 import 的区别:

  1. 遵循规范:
    require / exports 是CommonJS的一部分;
    import / export 是ES6的新规范,如果要兼容浏览器的话必须转化成es5的语法;

  2. 调用时间:
    require 是运行时调用,所以require理论上可以运用在代码的任何地方;
    import 是编译时调用,所以必须放在文件开头

  3. 本质:
    require 是赋值过程,其实require的结果就是对象、数字、字符串、函数等,再把require的结果赋值给某个变量;
    import 是解构过程,但是目前所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require;

  4. babel的 sourceType 的作用:
    sourceType: 表明代码应该解析的模式。
    可以是 “script”,“module” 或者 “unambiguous” 中任意一个。
    默认为 “script”。
    “unambiguous” 将使得 Babylon 尝试根据 ES6 的 import 或者 export 声明来进行推测。
    具有 ES6 import 和 export 的文件被认为是 “module”,否则被认为是 “script”。
    官方解释

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值