.ts-loader是如何与vue单文件组件衔接作用的

https://github.com/microsoft/TypeScript-Vue-Starter

https://www.npmjs.com/package/ts-loader

从文档上可以看到,需要安装 typescript 和 ts-loader这两个依赖

ts-loader是如何处理.vue单文件组件的,

在rule的配置里,ts-loader的test是以.ts文件结尾的啊,下面研究下

———————————————————————————————

首先再来回忆一下vue-loader+VueLoaderPlugin的处理过程:

vueloaderplugin在webpack初始化的阶段,

vueloaderplugin扩展了开发者module.rule的配置,加入了vue-loader内部提供的pitcher-loader(即:pitcher这个rule,它的use是pitcher-loader),

(pitcher的resourceQuery是 request带”vue”这个query的 (如xxx.xx?vue&xxx) )

并以这样的顺序将rule重新组合

[pitcher,…clone Rules,…vue-loader] (将vue-loader放到最后,将pitch-loader放到最开始)

pitcher-loader的匹配条件是,request中带”vue”这个query  (如xxx.xx?vue&xxx)

Step1:

当处理一个.vue文件的时候,vue-loader会判断,如果request不带type=vue,会生成下面这一大段js module:

"import { render, staticRenderFns } from "./index.vue?vue&type=template&id=2964abc9&"

import script from "./index.vue?vue&type=script&lang=ts&"

export * from "./index.vue?vue&type=script&lang=ts&"

/* normalize component */

import normalizer from "!../node_modules/vue-loader/lib/runtime/componentNormalizer.js"

var component = normalizer(

script,

render,

staticRenderFns,

false,

null,

null,

null

)

/* hot reload */

if (module.hot) {

var api = require("/Users/huhao/Desktop/demo/node_modules/vue-hot-reload-api/dist/index.js")

api.install(require('vue'))

if (api.compatible) {

module.hot.accept()

if (!api.isRecorded('2964abc9')) {

api.createRecord('2964abc9', component.options)

} else {

Step2:

然后开始对这个新生成的一坨jsmodule进行处理,依赖收集的过程中,会拿到

import { render, staticRenderFns } from "./index.vue?vue&type=template&id=2964abc9&"

import script from "./index.vue?vue&type=script&lang=ts&"

export * from "./index.vue?vue&type=script&lang=ts&"

这些行request,然后对每个request进行resolve,创建独立的module..

因为request带vue这个query,所以会先被pitcher-loader处理,pitcher在runLoaders过程中操作,会第一个执行,剔除掉eslint-loader,剔除pitcher自身,根据不同的type=xxx 返回一段新的request,

..有template的..

..有style的..

..有script的..

然后我们会发现这个时候处理script的生成的request,附带了ts-loader了。

问题: 为什么script的部分生成的request。。直接就判定附带有ts-loader了

"/Users/huhao/Desktop/demo/node_modules/ts-loader/index.js??ref--2!/Users/huhao/Desktop/demo/node_modules/vue-loader/lib/index.js??vue-loader-options!/Users/huhao/Desktop/demo/src/index.vue?vue&type=script&lang=ts&"

我们向前看,

在最后生成上面这坨request的过程前,会先经过build的过程,

在调用栈doBuild的时候,要执行runLoaders方法的时候,this.loaders就已经包括ts-loader了

ts-loader如何与vue单文件组件衔接的更多相关文章

  1. webpack入坑之旅(五)加载vue单文件组件

    这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...

  2. Vue单文件组件

    前面的话 本文将详细介绍Vue单文件组件 概述 在很多 Vue 项目中,使用 Vue.component 来定义全局组件,紧接着用 new Vue({ el: '#container '}) 在每个页 ...

  3. vue 单文件组件

    在很多vue项目中,我们使用vue.component来定义全局组件,紧接着用new Vue({el:'#container'})在每个页面内指定一个容器元素 这种方式在很多中小规模的项目中运作的很好 ...

  4. webpack打包vue单文件组件

    一.vue单文件组件 ①文件扩展名为 .vue 的 就是single-file components(单文件组件) ②参考文档:单文件组件 二.webpack加载第三方包 ①项目中,如果需要用到一些第 ...

  5. 基于VSCode的vue单文件组件模板设置---一次设置,可爽终生

    第一步: 第二步: 第三步: 打开vue.json文件后,如果是初次设置,应该如下图所示,绿色注释部分不用管,注意那两个白色大括号 第四步:在大括号内全部粘贴如下代码,保存即可完成vue模板的设置 & ...

  6. vue 单文件组件最佳实践

    vue 单文件组件最佳实践 生命周期 template <template> <section> <h1>vue single file components te ...

  7. 一丢丢学习之webpack4 + Vue单文件组件的应用

    之前刚学了一些Vue的皮毛于是写了一个本地播放器https://github.com/liwenchi123000/Local-Music-Player,如果觉得ok的朋友可以给个star. 就是很简 ...

  8. vue单文件组件的构建

    在很多Vue项目中,我们使用 Vue.component 来定义全局组件,这种方式在很多中小规模的项目中运作的很好. 但当在更复杂的项目中,就有了很大的弊端. 我们就可以用文件扩展名 .vue的单文件 ...

  9. Vue单文件组件基础模板

    背景 相信大家在使用Vue开发项目时,基本都是以单文件组件的形式开发组件的,这种方式好处多多: 1.代码集中,便于开发.管理和维护 2.可复用性高,直接将vue文件拷贝到新项目中 我暂时就想到这两点, ...

随机推荐

  1. solr7中文分词包

    刚刚将solr4升级到了solr7.7,发现之前用的mmseg4j中文分词包用的时候会报错,插入新数据是创建索引会有异常 possible analysis error: startOffset mu ...

  2. Almost Regular Bracket Sequence CodeForces - 1095E (线段树,单点更新,区间查询维护括号序列)

    Almost Regular Bracket Sequence CodeForces - 1095E You are given a bracket sequence ss consisting of ...

  3. 生产问题之泛型自动推断(JDK1.7新特性)

    今天提完代码,新来同事拉下代码后,如下代码出现异常: List<TblBlockMoneyDtl> transData = new ArrayList<>(); 分析原因后发现 ...

  4. 原来你是这样的 jsonp(原理与具体实现细节)

    前言 原文地址 仓库地址 jsonp(JSON with padding)你一定不会陌生,前端向后端拿数据的方式之一,也是处理跨域请求的得利助手. 我们早已习惯,早已熟练了jQ或者zepto的ajax ...

  5. python中sys.argv[]用法

    sys.argv[]的作用: 在运行python文件的时候往文件里面传递参数. 从函数外部获取到变量值 import sys arg = sys.argv[0] args = sys.argv[:] ...

  6. 【agc002f】Leftmost Ball

    题目大意 有n种颜色,每种k个球.将这些球任意排列,将每种颜色中最前面的一个求涂成白色(就是n+1种颜色),求最终的排列的方案的个数. 解题思路 考虑如何计算不会算重, 按颜色顺序,每次往排列插入k个 ...

  7. webpack5持久化缓存

    Opt-in webpack 旨在注重构建安全而非性能.我们没有打算默认启用这一功能,主要原因在于此功能虽然有 95% 几率提升性能,但仍有 5% 的几率中断你的应用程序/工作流/构建. 什么是缓存失 ...

  8. Linux内核概述

    概述 1. 多数服务器都是Linux,Windows只在PC方面应用. 2. .NET只能在Windows中应用,适用于中小型项目,在大型项目中应用很少.现在出现了Windows服务器(外围的服务器) ...

  9. HYSBZ - 3813 奇数国 欧拉函数+树状数组(线段树)

    HYSBZ - 3813奇数国 中文题,巨苟题,巨无敌苟!!首先是关于不相冲数,也就是互质数的处理,欧拉函数是可以求出互质数,但是这里的product非常大,最小都2100000,这是不可能实现的.所 ...

  10. python中的位运算

    目录 1.判断奇偶数 2.交换两个数 3.找出没有重复的数 4.3的n次方 5. 找出不大于N的最大的2的幂指数 1.判断奇偶数 如果把n以二进制形式展示的话,我们只需要判断最后一个二进制位是1还是0 ...