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 json 新手入门文档
Dec 03 Javascript
jQuery对象和DOM对象的相互转化实现代码
Mar 02 Javascript
Jquery调用webService远程访问出错的解决方法
May 21 Javascript
读jQuery之十三 添加事件和删除事件的核心方法
Aug 23 Javascript
document.documentElement的一些使用技巧
Apr 18 Javascript
一个js过滤空格的小函数
Oct 10 Javascript
jQuery内容过滤选择器用法分析
Feb 10 Javascript
手机端页面rem宽度自适应脚本
May 20 Javascript
JQ实现新浪游戏首页幻灯片
Jul 29 Javascript
快速解决js中window.location.href不工作的问题
Nov 02 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
Nov 24 Javascript
JavaScript如何借用构造函数继承
Nov 06 Javascript
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
php UBB 解析实现代码
2011/11/27 PHP
Yii框架的redis命令使用方法简单示例
2019/10/15 PHP
手把手教你自己写一个js表单验证框架的方法
2010/09/14 Javascript
需要做特殊处理的DOM元素属性的访问
2010/11/05 Javascript
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
javascript的函数、创建对象、封装、属性和方法、继承
2011/03/10 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
JQuery实现展开关闭层的方法
2015/02/17 Javascript
JavaScript模拟实现继承的方法
2015/03/30 Javascript
JavaScript实现给按钮加上双重动作的方法
2015/08/14 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
原生JS实现图片网格式渐显、渐隐效果
2017/06/05 Javascript
在vue项目中安装使用Mint-UI的方法
2017/12/27 Javascript
vue-cli3.0使用及部分配置详解
2018/08/29 Javascript
Vue框架里使用Swiper的方法示例
2018/09/20 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
JS实现小星星特效
2019/12/24 Javascript
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
python 提取文件的小程序
2009/07/29 Python
在Django的视图(View)外使用Session的方法
2015/07/23 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
2017/12/14 Python
python实现飞机大战微信小游戏
2020/03/21 Python
对python中的高效迭代器函数详解
2018/10/18 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
python爬取盘搜的有效链接实现代码
2019/07/20 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
html5 实现客户端验证上传文件的大小(简单实例)
2016/05/15 HTML / CSS
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
同事打架检讨书
2014/02/04 职场文书
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
中学生打架《检讨书》范文
2019/08/12 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang
Netty分布式客户端接入流程初始化源码分析
2022/03/25 Java/Android