不想看过程可以直接看最后的总结 :)

起因

前天的时候就遇到了一个非常棘手的问题,在高高兴兴写完 Vue 项目后,使用 npm link 在别的项目里导入自己的包报错(这里的变量都用 xxxx 或者 yyyy 来表示啦):

"export 'default' (imported as 'xxx') was not found in 'xxxx

但是如果我从 npm 上下载自己的包是不报错的,而使用 npm link 本地调试的时候就报上面的错。而且我还自己点进原文件看了下,npm 下载的和本地 npm linkxxx.umd.js 根本就是一毛一样啊,为什么两边的结果不一样呢?

谷歌了一波后发现别人也有有同样的问题:

下面他就说了两边出现不同结果的问题:

尤大也回复了,但是他说这不是 vue-cli 的问题,是 webpack 自己没有将文件转成 ES6 module 的形式。真的是看的我一脸问号。

为什么报错

没办法,他不说解决方法,我自己总得解决吧。首先将谷歌一下报错信息,得到的解答是: 同时使用了 importmodule.exports 语法,所以才报错。什么?这怎么可能,两边的项目肯定都没这样用过。除非是。。。。。我引入的那个打包后的文件 xxx.umd.js 是有 module.exports 语句的。

难道真的是 Webpack 没有转成 ES6 的问题?

坑:官方文档

第一反应是官方文档应该有教怎么打包项目的,里面说不定有答案,所以回去认真读了下文档,可是:

woc,Webpack 真的不能转成 ES6 Module 的啊。所以现在问题变成了:Webpack 将原来的项目打包成 ES5 的版本,然后在新项目里用 import 里引入了带有 module.exports 语句的文件,从而导致上面的报错。

坑:Vue CookBook

这时我注意到上面出现同样问题的大哥说到可以用 Rollup.js 来打包,这就可以打包出 ES6 语法的 JS了。马上开搞,然后查到了 Vue CookBook:

果然可以打包成 xxxx.esm.js 的方法,但是原来的项目是用 Webpack + Vue 来构建的,使用两套打包工具真的好吗?虽然不太好,我试了下,奈何在全局引入 .scss 文件的地方试了一万个方法都不行,只能放弃这个方法。从头开始分析。

Webpack 是真的坑

说实话那天我就放弃了,本地调试不行就算了吧,不就搞很多个 npm 版本么。后面还是 Jetbrains 给了我灵感。

今天我想删除某个文件的时候发现了这个选项:

Exclude?嗯。。。曾经的我就在 webpack.config.js 里看到过这个选项,好像说是可以不对某些文件进行编译,这样就能在 yarn run build 的时候提高性能。再结合一下前面分析的“没有转成 ES6 语法”的报错,好像有点说通了。非常有可能 Webpack 对从 npm 下载下来的文件进行预先编译,将其转成 ES6,而本地引入的话没有预先编译

后面我做了如下测试: 1. 将 /dist 下所有文件拷到新项目的 /src 里,直接本地引入,同样报错。 2. 将 /dist 下所有文件拷贝到新项目的 /node_modules 里,直接本地使用 import '/node_modules/xxx/xxx.umd.js' 引入,成功! 3. 在新项目使用 npm link xxx 后,在 /node_modules 里用上面的 import '/node_modules/xxx/xxx.umd.js' 引入,失败。

再次分析

上面 1 和 2 的测试足以说明我的猜想是对的,Webpack 会对 /node_modules 下的文件进行预先编译,再引入到真实项目中,这样就没有 module.exports 的语句了,所以也就不会报错了。

但是为什么 3 也失败呢?我在命令行里输入 ls -a 也发现自己的 xxx 包呀,说明我的原来的项目包也在 /node_modules 下呀。后面想到 Mac 的 link 命令,npm link 说不定是创建软链接而已,所以用 Finder 打开新项目的 /node_modules ,果然这是个软链接:

而这个软链接指向的真实地址是本机的别的地址,也就是说这个包不在项目的 /node_modules 文件夹下。所以不会预先被编译,再次印证上面的猜想。

现在终于真相大白了。

总结

为什么报错

如果使用下载的 npm package,那么 Webpack 在项目引入前将代码编译成 ES6 模块语法,所以这时候不会报错。

如果使用 npm link 会将 npm 包放在本机的全局 /node_modules 下,新项目的 /node_modules 下只是一个软链接(快捷方式)。而不在新项目 /node_modules 下的文件都不会预先编译成 ES6 模块方法。在项目里引入也就等同于下面代码:

// B.js
module.exports = {}// A.js
import "B.js"

而这两种语法混合使用就会报错:

"export 'default' (imported as 'xxx') was not found in 'xxxx

解决方法

我简单搜索了一下没找到什么解决方法(真的不知道要怎么搜这种问题了)。所以现在最笨的方法就是每次 yarn run build 后将 /dist 目录拷到别的项目的 /node_modules 下,然后在那个项目引入就可以了。

from scapy.all import * 调试失败_记一次错:Vue-构建项目后使用 npm link 失败相关推荐

  1. java 请求https 握手失败_记一次https访问握手失败(handshake failure)

    那么基本可以排除不是证书的问题了,而且把curl的verbose/debug模式打开也看到,ssl认证是ok的,如下 * Connected to cdn.example.com (52.222.23 ...

  2. python安装成功第三方库但import出问题_为什么会在pyspark在RDD中调用python第三方库失败?...

    问题描述 Hi, 我在公司线上运行pyspark时调用jieba分词, 发现可以成功import, 但是在RDD中调用分词函数时却提示没有 module jieba, 在本地虚拟机时没有这些问题 问题 ...

  3. 红米k30 允许调用gpu调试层_记一次APP的so层算法逆向(六)

    " 前言:初学逆向 请多多指教" 学习到的内容 - 1.在java层,对容器类的对象进行hook来进行快速定位 2.ida的findcrypt插件对so层的算法快速识别 3.文章分 ...

  4. corspost请求失败_记一次 CORS 跨域请求出现 OPTIONS 请求的问题及解决方法

    今天前后端在联调接口的时候,发生了跨域请求资源获取不到的问题. 首先说明下跨域问题的由来.引自HTTP 访问控制 的一段话: 当 Web 资源请求由其它域名或端口提供的资源时,会发起跨域 HTTP 请 ...

  5. node n 切换node版本失败_记一次 node-sass@4.x 安装失败

    今天在维护一个基于 vue-cli 创建的旧项目,在安装依赖时会报错,具体信息如下: gyp ERR! stack Error: spawn C:Program Files (x86)Microsof ...

  6. raidrive安装失败_记一次RaiDrive映射OneDrive遇到的问题

    大概在1周以前,出于需要存放直播录像的原因,根据别人的视频教程去自己动手搞了个5T网盘的帐号. (体验一下,其实我还同时存一份在百度云,怕不稳定) 用RaiDrive创建OneDrive的映射,在这步 ...

  7. sql联机丛书安装失败_放弃Android:系列丛书,第12部分-苹果的失败

    sql联机丛书安装失败 (11 August, 2020 at 1:42 am PST) edit- This article previously neglected to mention that ...

  8. 卡莱特led显示屏调试教程_恒彩光电重庆P3 LED显示屏项目顺利完工

    近日由恒彩光电承制的重庆工程学院演艺厅P3室内全彩LED显示屏项目顺利完工,调试即将交付使用. P3全彩LED显示屏是一款高清屏,像素点达111111点/㎡,每个像素点之间的点间距为3mm:颜色混合更 ...

  9. 转换到bot模式失败_《认知觉醒》:为什么越“努力”,会越失败

    生活中,每个人都想用最捷径的方式,去轻松获取知识,比如说每天听一本书,参加一个课程,然后订阅一个名家专栏,用各种"努力"和"用力"去拼人生,然而结果却越来越失败 ...

最新文章

  1. 机器学习与数据科学 基于R的统计学习方法(基础部分)
  2. LAMP网站架构方案分析
  3. 网页设计过程中一般命名规则
  4. vs系列自带的localdb数据库当做数据库
  5. 2008年第四季度开发者Top 100 Blogs
  6. ITK:创建一个自定义颜色图
  7. Qt Creator调试C ++示例应用程序
  8. 360公布权威机构对扣扣保镖的测试报告
  9. Kogito,ergo规则:从知识到服务,轻松自如
  10. 最全傅里叶变换和拉普拉斯变换公式总结
  11. ubuntu编译tensorflow 支持AVX,AVX2等指令集
  12. 云计算IaaS-Pssa-Saas(云计算的基本架构)
  13. CPU是沙子做的,凭什么卖那么贵?
  14. 计算机 无法 访问共享网络打印机,“无法连接到网络共享打印机”的常见原因和解决方法:...
  15. javaweb项目实战(附有源码)
  16. 机器视觉光源选型总结---颜色选择
  17. 基于Javaweb实现餐饮管理系统
  18. Gank教学贴:Gank是一门艺术 不是固定的套路
  19. 数据回顾东京奥运会中国体育代表团金牌时刻
  20. 3dbox and 2d box bounding_box

热门文章

  1. linux 装完yum不能用,解决yum不能正常使用的问题
  2. input 单击 图标_input添加小图标
  3. 【Python之旅】第四篇(四):基于面向对象的模拟人生游戏类
  4. log4net用法实例
  5. 用express搭建网站
  6. 许三多修路带给我们成功的启示
  7. android dialog的封装,Android系统Dialog的简单封装
  8. TCP三次握手连接和TCP四次挥手及大量TIME_WAIT解决方法:
  9. Tomcat的安装、配置常见问题
  10. C#按Esc后退出对话框