解决Cannot find module ‘node-sass’

javascript/jquery

浏览数:226

2020-6-11

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吧

作者:Runningfyy