0.起因
今天用vue-cli的default模版快速初始化了一个项目,然后github拉了一段vue代码,准备研究一下,没想到编译到时候遇到这个报错
1.盲目尝试
由于看报错是缺少node-sass模块,以前好像装过这个模块,一般出到问题都是权限不够装不上
于是
sudo npm install --unsafe-perm node-sass
装是装上了,但是还是报Error: Cannot find module 'node-sass'
这个错误
期间试过node-sass降级处理,还是失败
在goole上搜Error: Cannot find module 'node-sass'
出来的基本是教你怎么装,实质也就是解决权限问题
2.曙光
装是装上了,但是貌似这个包找不到。这个时候仔细读了一下报错信息,而不是只看关键词
我们顺着读一下报错信息
1.在编译到transition.scss的时候报错
2.在/user/node_modules/sass-loader/dist/cjs.js里面模块构建失败
3.失败的原因是找不到'node-sass'包
4.依赖栈
.../dist/getDefaultSassImplementation.js
.../dist/getSassImplementation.js
.../dist/index.js
/user/node_modules/sass-loader/dist/cjs.js
然后全局找了下有这个报错文件,我发现我引入的.vue文件有对这个报错文件的引用
// .vue文件里面
import Tooltip from 'element-ui/lib/tooltip.js'
import 'element-ui/lib/theme-chalk/tooltip.css';
import 'element-ui/packages/theme-chalk/src/common/transition.scss';
注释掉这个样式文件就不会报错了。
所以貌似看起来就是解析这个sass文件出了问题,找不到node-sass。
3.研究
我项目里面安装了node-sass,node_module里面有这个文件夹,为什么会找不到呢?在看报错信息 结合信息2和4
我看了下4里面的各种文件 (特别注意这里路径都是全局globle的不是项目里面
)
cjs.js里面有对./index.js的引用
index.js有对./getSassImplementation.js的引用
getSassImplementation.js有对./getDefaultSassImplementation.js的引用
getDefaultSassImplementation.js里面这么写的
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
function getDefaultSassImplementation() {
let sassImplPkg = 'node-sass'; //标记1
try {
require.resolve('node-sass');
} catch (error) {
try {
require.resolve('sass');
sassImplPkg = 'sass';
} catch (ignoreError) {
sassImplPkg = 'node-sass';
}
} // eslint-disable-next-line import/no-dynamic-require, global-require
return require(sassImplPkg); //标记2
}
var _default = getDefaultSassImplementation;
exports.default = _default;
看标记1和标记2,实际上就是require('node-sass'),这里require不到,所以就有了报错的由来
4.一波三折
研究到这就简单了,我全局安装一个node-sass。只要能在/user/node_modules/里面找到node-sass这个包就没问题了
这个貌似安装好了吧,再次编译,为毛还是报错???
为毛还是??
为毛?
冷静,程序说还是找不到包,我们先在/user/node_modules/里面找找node-sass, 卧槽,我的包呢?
看了下安装信息, 原来这个node-sass属于node模块安装到了这里/Users/fengyangyang/.nvm/versions/node/v12.4.0/lib/node_modules/node-sass
5.解决
这里的话,我估计
手动改变这个地址引用理论上
,应该
可以解决这个问题
不过我没这个干,我注意到另外一个问题报错信息2
为什么会用全局的sass-loader?我本地没安装吗
卧槽,本地真的没装, npm i sass-loader后解决了这个问题
因为本地的 sass-loader能找到本地node_modiule里面的node-sass
6.总结
处理这个问题是曲折的,使我学会了报错信息真的得看全
总结一下 这个问题是因为
本地没安装sass-loader,所以引用的是全局的sass-loader,但是全局的sass-loader在node_module里面是不可能找到node-sass的,因为全局node-sass安装在.nvm目录里面(这个不一定,因为我用的nvm管理的node包)
所以这也算是sass-loader的一个小bug吧
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。