Nuxt升级2.0.0时出现的问题(小结)


Posted in Javascript onOctober 08, 2018

喜大普奔,Nuxt终于正式发布2.0了,最近趁热把博客从1.4升级到了2.0,并且用Typescript重构了下,可以点Jooger.me看下,在升级Nuxt过程中出现了一个小问题

关于release 2.0的公告可以查看官网的Release Notes以及官方的Demo,升级过程十分简单,基本不需要什么迁移成本,所有npm命令都跟以前一样,只需要把一些关联包升级一下即可

今天出现的问题是这样的,随着nuxt升级,webpack和vue-loader也分别升级到了4和15,升级过后,报了如下问题

Invalid source file: ***.vue. Ensure that the files supplied to lint have a .ts, .tsx, .d.ts, .js or .jsx extension.

一般看到这个extension的问题都下意识地想到webpack的resolve.extensions没有配置.ts或者.tsx扩展,但其实不然,仔细看前半句会发现是在处理.vue文件的时候报的这个错,所以很容易就想到应该是vue-loader的问题了,在vue-loader的这个issue讨论了这个问题

耐心查看完,会发现其实是tslint-loader的typeCheck在作怪,如果开启这个选项,那就会导致上述错误,理由是这个选项导致在构建的时候tslint会lint整个vue文件,而不单单是文件里的ts部分,所以直接解决办法是把tslint-loader的typeCheck去掉

至于为啥会lint全文件,这个后续再验证下,应该是vue-loader15的对vue文件进行拆分时出现问题

而且关掉typeCheck会出现什么问题,目前还未发现

到这里可以其实再进一步思考一下,为啥vue-cli3的tslint没有报错了,看了下vue-cli的ts插件cli-plugin-typescript里的代码

addLoader({
 loader: 'ts-loader',
 options: {
  transpileOnly: true,
  appendTsSuffixTo: ['\\.vue$'],
  // https://github.com/TypeStrong/ts-loader#happypackmode-boolean-defaultfalse
  happyPackMode: useThreads
 }
})
// make sure to append TSX suffix
tsxRule.use('ts-loader').loader('ts-loader').tap(options => {
 options = Object.assign({}, options)
 delete options.appendTsSuffixTo
 options.appendTsxSuffixTo = ['\\.vue$']
 return options
})

config
 .plugin('fork-ts-checker')
  .use(require('fork-ts-checker-webpack-plugin'), [{
   vue: true,
   tslint: options.lintOnSave !== false && fs.existsSync(api.resolve('tslint.json')),
   formatter: 'codeframe',
   // https://github.com/TypeStrong/ts-loader#happypackmode-boolean-defaultfalse
   checkSyntacticErrors: useThreads
  }])

可以看到它是用了fork-ts-checker-webpack-plugin这个webpack插件,具体什么用途可以看看它的README

所以modules/typescript.js最终配置如下

const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin')

module.exports = function () {
 // Add .ts extension for store, middleware and more
 this.nuxt.options.extensions.push("ts")
 // Extend build
 this.extendBuild(config => {
  const tsLoader = {
   loader: 'ts-loader',
   options: {
    transpileOnly: true,
    appendTsSuffixTo: [/\.vue$/]
   }
  }
  // Add TypeScript loader
  config.module.rules.push(
   Object.assign({
     test: /((client|server)\.js)|(\.tsx?)$/
    },
    tsLoader
   )
  )
  // Add .ts extension in webpack resolve
  if (config.resolve.extensions.indexOf(".ts") === -1) {
   config.resolve.extensions.push(".ts");
  }

  config.plugins.push(new ForkTsCheckerWebpackPlugin({
   vue: true,
   tslint: true,
   formatter: 'codeframe',
   // https://github.com/TypeStrong/ts-loader#happypackmode-boolean-defaultfalse
   checkSyntacticErrors: process.env.NODE_ENV === 'production'
  }))
 })
}

更新

今天在用的时候,发现改了代码save的时候,nuxt会重新hot reload,这时会报如下错误

Error: fork-ts-checker-webpack-plugin hooks are already in use

很明显,是reload过程中,加载了两次,所以modules/typescript.js代码更新如下

const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin')

// 判断时候load过这个plugin
let hasForkTsCheckerPlugin = false

module.exports = function () {
 // Add .ts extension for store, middleware and more
 this.nuxt.options.extensions.push("ts")
 // Extend build
 this.extendBuild(config => {
  const tsLoader = {
   loader: 'ts-loader',
   options: {
    transpileOnly: true,
    appendTsSuffixTo: [/\.vue$/]
   }
  }
  // Add TypeScript loader
  config.module.rules.push(
   Object.assign({
     test: /((client|server)\.js)|(\.tsx?)$/
    },
    tsLoader
   )
  )
  // Add .ts extension in webpack resolve
  if (config.resolve.extensions.indexOf(".ts") === -1) {
   config.resolve.extensions.push(".ts");
  }

  if (!hasForkTsCheckerPlugin) {
   // 第一次load
   hasForkTsCheckerPlugin = true
   config.plugins.push(new ForkTsCheckerWebpackPlugin({
    vue: true,
    tslint: true,
    formatter: 'codeframe',
    // https://github.com/TypeStrong/ts-loader#happypackmode-boolean-defaultfalse
    checkSyntacticErrors: process.env.NODE_ENV === 'production'
   }))
  }
 })
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 控制弹出窗口
Apr 10 Javascript
js的with语句使用方法
Sep 21 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
Oct 11 Javascript
Javascript模拟加速运动与减速运动代码分享
Dec 11 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
Apr 12 Javascript
js获取当前时间(昨天、今天、明天)
Nov 23 Javascript
值得收藏的vuejs安装教程
Nov 21 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
Nov 23 Javascript
深入理解react-router 路由的实现原理
Sep 26 Javascript
layui table 表格上添加日期控件的两种方法
Sep 28 Javascript
JS异步宏队列微队列原理详解
Sep 09 Javascript
Vue解决移动端弹窗滚动穿透问题
Dec 15 Vue.js
vue页面切换过渡transition效果
Oct 08 #Javascript
angularJs自定义过滤器实现手机号信息隐藏的方法
Oct 08 #Javascript
angular中子控制器向父控制器传值的实例
Oct 08 #Javascript
对angularjs框架下controller间的传值方法详解
Oct 08 #Javascript
对angularJs中controller控制器scope父子集作用域的实例讲解
Oct 08 #Javascript
CKEditor4配置与开发详细中文说明文档
Oct 08 #Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
Oct 08 #Javascript
You might like
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
小型js框架veryide.librar源代码
2009/03/05 Javascript
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
2013/01/11 Javascript
JavaScript对象创建及继承原理实例解剖
2013/02/28 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
详解webpack 热更新优化
2018/09/13 Javascript
elementUI select组件默认选中效果实现的方法
2019/03/25 Javascript
详解vue在项目中使用百度地图
2019/03/26 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
[01:15]《辉夜杯》北京网鱼队巡礼
2015/10/26 DOTA
numpy中索引和切片详解
2017/12/15 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
2018/10/18 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
详解python中@的用法
2019/03/27 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
python程序快速缩进多行代码方法总结
2019/06/23 Python
django 中的聚合函数,分组函数,F 查询,Q查询
2019/07/25 Python
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
英国珠宝网站Argento: PANDORA、Olivia Burton和Nomination等
2020/05/08 全球购物
C# Debug和Testing相关面试题
2015/10/25 面试题
应届生服务员求职信
2013/10/31 职场文书
大学生的应聘自我评价
2013/12/13 职场文书
交通安全寄语大全
2014/04/08 职场文书
酒店管理失职检讨书
2014/09/16 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
2014年信用社工作总结
2014/11/25 职场文书
2014年人民调解工作总结
2014/12/08 职场文书
美丽的大脚观后感
2015/06/03 职场文书
归途列车观后感
2015/06/17 职场文书
道士塔读书笔记
2015/06/30 职场文书
晶体管来复再生式二管收音机
2021/04/22 无线电