vue2中支持可选链运算符(?.)

1,891 阅读3分钟

前不久在项目开发中遇到了一个问题,搞的很是苦恼,所以想总结一下分享给大家

背景

公司现有的所有项目都是基于vue-cli3来搭建的vue2的项目;然后发现好多项目应用的组件都是相同的;所以就用vue2搭建了一个组件库,满心欢喜的搭建完了之后。本来打算要发布了,结果在打包的时候出现了一个问题:

Module parse failed: Unexpected token (64:39)
File was processed with these loaders:
 * ./node_modules/_vue-loader@15.10.1@vue-loader/lib/loaders/templateLoader.js
 * ./node_modules/_vue-loader@15.10.1@vue-loader/lib/index.js
You may need an additional loader to handle the result of these loaders.
|                                   class:
|                                     item.dictionary[scope.row[item.prop]]
>                                       ?.class,
|                                   style:
|                                     item.dictionary[
 @ ./packages/gos-commonTable/src/commonTable.vue?vue&type=template&id=0d130db6& 1:0-243 1:0-243
 @ ./packages/gos-commonTable/src/commonTable.vue
 @ ./packages/gos-commonTable/index.js
 @ ./src/index.js
 @ multi ./src/index.js

image.png

思路

刚开始看到这个bug的时候是比较坦然的,谁叫自己没有用vue-cli搭建,非要自己逞能,自己几斤几两不知道?so?直接用vue-cli替换掉自己这么多天的辛苦付出?那肯定是不行的!!!所以就开始了自己孤独又懊恼的解bug之路。

1.跟着错误提示解bug

错误提示中有句这样的话; You may need an additional loader to handle the result of these loaders. ok,懂了,这还不简单? babel是干啥的?嗯,解析的,记得有个插件说是可以解析"?.";一顿猛如虎的操作:

  1. npm i @babel/plugin-proposal-optional-chaining;
  2. .babelrc中添加这个插件;
  3. 打包

image.png 报错,Error: Cannot find module '@babel/core'; 为啥会有这个报错呢,然后看了一下自己的package.json文件,自己用的是"babel-core": "^6.26.3",后来上网查了一下,挂@babel的都是7版本了。为了解决问题,毅然决然升级babel7 npm install babel-upgrade -g;结果会有一些问题,很简单,百度直接可以解决,这里就不一一赘述了。 然后重新在次打包;

结果就是没有结果,报错依然在,很是蛋疼;

2.去github中寻找真理

老规矩还是在错误提示中继续寻求提示:哪里报的错?@vue-loader,好的,直接github中去搜; github.com/vuejs/vue-l… ;结果还真有人报这个错误;

image.png 一个叫yyx的小哥在下面评论:“嗯。怎么讲,你这个东西……有解。”还附带了一个链接github.com/vuejs/vue/c…

image.png

???怎么跳转到vue来了?接下来我又懂了,我的vue版本是2.6.10;人家在2.7.0解决的这个问题,肯定是我不合规矩了,改一下,就是宠它;

  1. package.json,直接改vue的版本到2.7.0;
  2. 删除没用的lock文件;
  3. npm i
  4. 执行打包命令

嘿,你猜咋样了?报错依然在。。。nm,拴Q了!!! 内心深处不想解了,替换vue-cli吧,安静的想了10几秒后,继续搞起来。。。年轻的程序员怎能轻言放弃?

babel

冷静的想一下,大家都在用可选链,肯定不是vue的问题,只要保证版本跟上来就好了;肯定是babel我没有理解透,然后就再去看babel的文档;

image.png

很醒目,人家就是用来解析js的,模版语法还是得去找专业的工具解决,所以vue用什么解?嗯,没错,vue-loader;

vue-loader

然后我就二进宫,这次去找vue-loader的官网,发现有个叫‘compiler’的东西是用来解析模版语法的;默认应用的是vue-template-compiler;结果在百度的帮助下找到了'vue-template-babel-compiler';直接使用打包,一气呵成,爽~

解决办法

'@babel/plugin-proposal-optional-chaining', 是babel7用来解析js中的可选链运算符的; 'vue-template-babel-compiler',是用来解析vue模版中的可选链运算符;

使用'@babel/plugin-proposal-optional-chaining'

  1. npm i @babel/plugin-proposal-optional-chaining
  2. .babelrc中添加配置
{
  "presets": [],
  "plugins": [ "@babel/plugin-proposal-optional-chaining"],
}

使用'vue-template-babel-compiler'

  1. npm i vue-template-babel-compiler
  2. webpack中添加配置
 module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          compilerOptions: {
            preserveWhitespace: false
          },
          compiler: require('vue-template-babel-compiler') // 解析可选链
        }
      },
     
    ]
  },
  plugins: []