node node-sass sass-loader 版本对应

项目中使用的 scss 编译过慢,经常在编译中途停止不动,怀疑是 sass-loader 版本问题,决定升级。

原版本:

node: 14.16.1
node-sass: ^7.0.1
sass-loader: ^7.3.1

vue.config.js 中 全局 scss 变量配置

module.exports = {
  css: {
    loaderOptions: {
      scss: {
        // 全局sass变量 
        //sass-loader 8.0.0以前版本 , v8 - prependData, v10+ - additionalData 
        data: `@import "~@/assets/scss/index.scss";`
      },
      sass: {
        // 全局sass变量 
        //sass-loader 8.0.0以前版本 , v8 - prependData, v10+ - additionalData 
        data: `@import "~@/assets/scss/index.scss";`
      }
    },
  },
}

现在一看就不对劲,node-sass 和 sass-loader 版本号,不完全对应,根据实际体验是可以用,但是用的不得劲。

升级后

node: 16.15.1,对应 npm版本:8.11.0node_modules 版本:93
node-sass: ^6.0.1
sass-loader: ^10.0.1

vue.config.js 中 全局 scss 变量配置

module.exports = {
  css: {
    loaderOptions: {
      scss: {
        additionalData: `@import "~@/assets/scss/index.scss";`
      },
      sass: {
        additionalData: `@import "~@/assets/scss/index.scss";`
      }
    },
  },
}

经官方寻找的版本号,node-sass 上有 node和 node-sass 对应版本号。
官方推荐 node 版本:node 官方下载地址
下载特定 node 版本:查看 node 与 npm、node_modules 对应版本号并下载

image.png

node-sass 对应的 sass-loader 部分版本号:
sass-loader 4.1.1,node-sass 4.3.0
sass-loader 7.0.3,node-sass 4.7.2
sass-loader 7.3.1,node-sass 4.7.2
sass-loader 7.3.1,node-sass 4.14.1
sass-loader 10.0.1,node-sass 6.0.1

综上,得出升级后对应的版本号。

TIPS:

  1. 升级过程中,当前最新 Node 是 v18+,想着升都升了,不如再升高级点,到 v17+,升级上去遇到报错 Error: error:0308010C:digital envelope routines::unsupported。
    原因: node v17 中的 OpenSSL3.0 对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响。在 node v17 以前一些可以正常运行的的应用程序,但是在 V17 版本可能会抛出以上异常。
    解决方法:
    windows 运行: set NODE_OPTIONS=--openssl-legacy-provider
    mac or linux 运行: export NODE_OPTIONS=--openssl-legacy-provider

    当然,我当时由于第 2 点的报错未解决,又装回了 v16+。

  2. 升级后启动项目报错:ValidationError: Invalid options object. Sass Loader has been initialised using an options object that does not match the API schema.
    一开始查找到的都是 node-sass 和 sass-loader 的版本号不对应,但是此处版本都是经过我精挑细选,从众多版本号中脱颖而出,独一无二的呢。
    必然不可能不对应(虽然比对、卸载重装了好多次,还把 package-lock.json 删掉,重新生成[npm insatall 可重新生成 package-lock.json])。
    最后发现原因是,上面的全局 scss 变量配置没有修改,sass-loader 已经 v10+,配置中还是使用的 v8- 的关键字。老字怎么配得上我新版本,不报错简直是天理不容!!!
    综上,此错的原因可能有两个,node-sass , sass-loader 版本不对应;或 vue.config.js 中全局 scss 变量配置关键字有误。

  3. npm i 的时候,如果 sass-loader 使用 v10.0.1,node-sass 使用 v6.0.1,即 版本号写死或版本号前为 ~ ,只升级最小的版本号,安装过程中会提示 当前 sass-loader 对应的 node-sass 为 v4+ 或 v5+。版本号前改为 ^ 解决,每次升级大版本号后面的。安装好后,查看 package-lock.json,最终安装的 node-sassv6.0.1sass-loaderv10.2.1

解决报错后,启动项目,完美执行,除了编译过程中,进度 67% 68% 处,两个数字反复横跳多次(不知原因),没有其他问题。也不卡着不动了,治好了我多年的心焦症。

:项目中 element-ui 样式刚开始引入的 scss 文件 (@import '~element-ui/packages/theme-chalk/src/index'),编译过程中提示 sass 2.0 中,某些用法会被弃用,检查出超多警告,之前在 element-ui 下执行 sass-migrator division */*.scss ,不会打印警告了。但感觉也会去检查,只是检查过程不打印出来而已, 甚至可能是编译中间卡住的罪魁祸首。
趁此次升级,改为引入 css 文件(@import '~element-ui/packages/theme-chalk/lib/index.css'),一举解决。
packages 下的文件为插件源代码,lib 为编译后输出的代码,使用 lib 方便些

完美 ending

[20220911 更新]:

  • 上面 vue.config.js 中配置的全局引入 scss,会在每个使用 scss 的 vue 组件中引入。因此,此处适合配置全局变量和 mixin 之类,单纯的全局样式,不建议在此处引入。如果执意在此处引入全局样式,有的 vue 文件中没有 style 样式标签,想要全局样式在此处生效,需要 vue 文件中写一个<style lang="scss">中间必须有内容 </style>(猜测因为配置文件是在每个 vue 文件单独引入的原因)。
  • 全局样式 scss,在 vue-cli4 + webpack 4.x 项目的 main.js 中,引入不报错,但也不生效(暂时没找到原因)。在 vue-cli5 + webpack5.x 项目的 main.js 中,引入生效。保险起见,在 app.vue 中全局引入最好。
    -引入 scss 文件时,使用 @import url('xxx.scss')语法,会被解析为 css 文件,里面的变量不会生效。应使用 @import 'xxx.scss'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容