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 相关文章推荐
jquery选择器排除某个DOM元素的方法(实例演示)
Apr 25 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
Jun 03 Javascript
防止页面url缓存中ajax中post请求的处理方法
Oct 10 Javascript
浅析node应用的timing-attack安全漏洞
Feb 28 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
Oct 24 Javascript
详解JavaScript 为什么要有 Symbol 类型?
Apr 03 Javascript
vue2 拖动排序 vuedraggable组件的实现
Aug 08 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
Sep 23 Javascript
JavaScript函数IIFE使用详解
Oct 21 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
Jan 21 Javascript
Vue 列表页带参数进详情页的操作(router-link)
Nov 13 Javascript
vue特效之翻牌动画
Apr 20 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
php读取javascript设置的cookies的代码
2010/04/12 PHP
php字符串操作常见问题小结
2016/10/11 PHP
PHP多进程之pcntl_fork的实例详解
2017/10/15 PHP
PHP实现统计代码行数小工具
2019/09/19 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
Javascript里使用Dom操作Xml
2006/09/20 Javascript
基于jQuery的消息提示插件之旅 DivAlert(三)
2010/04/01 Javascript
jQuery中parents()方法用法实例
2015/01/07 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
Angular2使用Guard和Resolve进行验证和权限控制
2017/04/24 Javascript
详解react-router4 异步加载路由两种方法
2017/09/12 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
2018/01/09 jQuery
关于vue面试题汇总
2018/03/20 Javascript
vue实现点击关注后及时更新列表功能
2018/06/26 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
vue实现微信获取用户信息的方法
2019/03/21 Javascript
vue模仿网易云音乐的单页面应用
2019/04/24 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
python 异常处理总结
2016/10/18 Python
Python之用户输入的实例
2018/06/22 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
Python模拟伯努利试验和二项分布代码实例
2020/05/27 Python
应届生法律顾问求职信
2013/11/19 职场文书
银行办理业务介绍信
2014/01/18 职场文书
银行职员个人的工作自我评价
2014/02/15 职场文书
行政办公室岗位职责
2014/03/18 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
营业用房租赁协议书
2014/11/26 职场文书
计划生育工作总结2015
2015/04/03 职场文书
军训新闻稿范文
2015/07/17 职场文书
2016基督教会圣诞节开幕词
2016/03/04 职场文书
MySQL中varchar和char类型的区别
2021/11/17 MySQL