You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
你们可以先思考五分钟,这里的分别处理是如何处理的?比如,样式内容需要通过 style-loader 才能将其放到 DOM 里。
好了,就当作聪明的你已经有思路了。我们继续往下看。
// templatelettemplateImport=`var render, staticRenderFns`lettemplateRequestif(descriptor.template){constsrc=descriptor.template.src||resourcePathconstidQuery=`&id=${id}`constscopedQuery=hasScoped ? `&scoped=true` : ``constattrsQuery=attrsToQuery(descriptor.template.attrs)constquery=`?vue&type=template${idQuery}${scopedQuery}${attrsQuery}${inheritQuery}`constrequest=templateRequest=stringifyRequest(src+query)templateImport=`import { render, staticRenderFns } from ${request}`}// scriptletscriptImport=`var script = {}`if(descriptor.script){constsrc=descriptor.script.src||resourcePathconstattrsQuery=attrsToQuery(descriptor.script.attrs,'js')constquery=`?vue&type=script${attrsQuery}${inheritQuery}`constrequest=stringifyRequest(src+query)scriptImport=(`import script from ${request}\n`+`export * from ${request}`// support named exports)}// stylesletstylesCode=``if(descriptor.styles.length){stylesCode=genStylesCode(loaderContext,descriptor.styles,id,resourcePath,stringifyRequest,needsHotReload,isServer||isShadow// needs explicit injection?)}
这三段代码的结构很像,最终作用是针对不同的 type 分别构造一个 import 字符串:
templateImport="import { render, staticRenderFns } from './App.vue?vue&type=template&id=7ba5bd90&'";scriptImport= "import script from './App.vue?vue&type=script&lang=js&'
export*from'./App.vue?vue&type=script&lang=js&'";stylesCode="import style0 from './App.vue?vue&type=style&index=0&lang=scss&'";
1 什么是
vue-loader
2 如何使用
vue-loader
2.1 安装
vue-loader
2.2 配置
webapck
2.3 创建一个
Vue
组件一个标准的
Vue
组件可以分为三部分:2.4 见证奇迹的时刻
打包完之后,这个
Vue
组件就会被解析到页面上:上面
Vue
组件里的<template>
部分解析到<body>
下,css
部分解析成<style>
标签,<script>
部分则解析到js
文件里。简单来说
vue-loader
的工作就是处理Vue
组件,正确地解析各个部分。vue-loader
的源码较长,我们分几个部分来解析。3. 源码解析之整体分析
我们先从入口看起,从上往下看:
vue-loader
接收一个source
字符串,值是vue
文件的内容。loaderUtils.stringifyRequest
作用是将绝对路径转换成相对路径。接下来有一大串的声明语句,我们暂且先不看,我们先看最简单的情况。
parse
方法是来自于component-compiler-utils
,代码简略一下是这样:可以看到,这里还不是真正
parse
的地方,实际上是调用了compiler.parseComponent
方法,默认情况下compiler
指的是vue-template-compiler
。这里可以看到,
parseComponent
应该是调用了parseHTML
方法,并且传入了两个方法:start
和end
,最终返回sfc
。这一块的源码我们不多说,我们可以猜测
start
和end
这两个方法应该是会根据不同的规则去修改sfc
,我们看一下sfc
即vue-loader
中descriptor
是怎么样的:vue
文件里的内容已经分别解析到对应的type
去了,接下来是不是只要分别处理各个部分即可。parseHTML
这个命名是不是有点问题。。。vue-loader
如何处理不同type
你们可以先思考五分钟,这里的分别处理是如何处理的?比如,样式内容需要通过
style-loader
才能将其放到DOM
里。好了,就当作聪明的你已经有思路了。我们继续往下看。
这三段代码的结构很像,最终作用是针对不同的
type
分别构造一个import
字符串:这三个
import
语句有什么用呢,vue-loader
是这样做的:此时,
code
是这样的:我们知道
loader
会导出一个可执行的node
模块,也就是说上面提到的code
是会被webpack
识别到然后执行的。我们看到
code
里有三次的import
,import
的文件都是App.vue
,相当于又加载了一次触发这次vue-loader
的那个vue
文件。不同的是,这次加载是带参的,分别对应着template
/script
/style
三种type
的处理。这个问题的答案就是,
webpack
在加载vue
文件时,会调用vue-loader
来处理vue
文件,之后return
一段可执行的js
代码,其中会根据不同type
分别import
一次当前vue
文件,并且将参数传递进去,这里的多次import
也会被vue-loader
拦截,然后在vue-loader
内部根据不同参数进行处理(比如调用style-loader
)。4. 待续
后续还有
vue-loader
的第二篇文章,讲解VueLoaderPlugin
的代码以及如何处理不同type
。The text was updated successfully, but these errors were encountered: