视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Nuxt升级2.0.0时出现的问题(小结)
2020-11-27 22:06:34 责编:小采
文档

一般看到这个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'
 }))
 }
 })
}

下载本文
显示全文
专题