当前位置:首页 > 科技  > 软件

三言两语说透webpack对vue的编译

来源: 责编: 时间:2023-08-09 23:03:51 214观看
导读1写在前面Webpack作为当下最流行的前端构建工具,它可以处理模块化的JavaScript项目,进行代码打包和优化。在Vue项目中,Webpack发挥着不可或缺的作用,它负责分析项目中的依赖图谱,递归地构建bundles,从而实现整个项目的构建

1写在前面

Webpack作为当下最流行的前端构建工具,它可以处理模块化的JavaScript项目,进行代码打包和优化。在Vue项目中,Webpack发挥着不可或缺的作用,它负责分析项目中的依赖图谱,递归地构建bundles,从而实现整个项目的构建。T1y28资讯网——每日最新资讯28at.com

那么Webpack是如何处理Vue单文件组件的呢?它又是通过哪些具体的步骤实现Vue项目的打包和部署的呢?这是每一个Vue开发者都应该理解和掌握的关键知识点。T1y28资讯网——每日最新资讯28at.com

2前置条件

当我们使用Vue CLI创建一个Vue项目时,会自动配置Webpack相关的配置。在项目的根目录下会有一个webpack.config.js文件,这就是Webpack的配置文件。T1y28资讯网——每日最新资讯28at.com

我们来看一下这个配置文件中与Vue相关的主要内容:T1y28资讯网——每日最新资讯28at.com

// webpack配置const vueLoaderPlugin = require('vue-loader/lib/plugin') module.exports = {  // ...省略其他配置    module: {    rules: [      // ... 其他规则      {        test: //.vue$/,        loader: 'vue-loader'      }    ]  },  plugins: [    // 请确保引入这个插件!    new vueLoaderPlugin()  ]}

vue-loader是Vue单文件组件(SFC)的 Webpack 加载器,它允许你以单文件组件的格式开发 Vue 组件。在 Vue 3 中,vue-loader 封装了 @vue/compiler-sfc,用于预处理单文件组件。我们来看看 vue-loader 的源码是如何工作的。T1y28资讯网——每日最新资讯28at.com

3源码分析

在vue-loader的源码中,定义了一个 NormalModule 类,这是 webpack 模块中代表一个模块的类。在它的 build 方法中,会调用 this._compile 方法对单文件组件进行加载和解析:T1y28资讯网——每日最新资讯28at.com

// webpack/lib/NormalModule.jsclass NormalModule {  // ...  build(options, compilation, resolver, fs, callback) {    this._compile(options, compilation, resolver, fs, (err, result) => {      // 处理结果...    });  }  _compile(options, compilation, resolver, fs, callback) {    const loaderContext = this.createLoaderContext(resolver, options, fs, compilation);    runLoaders(      {        resource: this.resource,        loaders: this.loaders,        context: loaderContext,        readResource: fs.readFile.bind(fs)      },      (err, result) => {        // 处理结果...      }    );  }}

在 _compile 中,会调用 runLoaders 方法,执行配置的所有 loader,其中就包含了 vue-loader。T1y28资讯网——每日最新资讯28at.com

接下来我们看一下 vue-loader 的源码,主要的是 pitch 方法:T1y28资讯网——每日最新资讯28at.com

// vue-loader/index.jsmodule.exports.pitch = function(remainingRequest) {  const { loaders, resourcePath, resourceQuery } = this;  const doTransform = !remainingRequest.includes(hotReloadAPIPath);   // 过滤热重载请求  if (doTransform && resourceQuery && resourceQuery.includes('type=script')) {    // 处理 <script> 部分  }  if (doTransform && resourceQuery && resourceQuery.includes('type=template')) {    // 处理 <template> 部分   }  if (doTransform && resourceQuery && resourceQuery.includes('type=style')) {    // 处理 <style> 部分  }  // 调用默认的 pitch 方法  defaultPitch.call(this, remainingRequest); };

pitch 方法会在一个 loader 处理资源之前被调用。在 vue-loader 中利用这一点,根据 resourceQuery 中传入的 type,分别处理单文件组件中的三个部分:T1y28资讯网——每日最新资讯28at.com

  • <script> 部分会使用 babel-loader 进行编译;
  • <template> 部分会使用 @vue/compiler-sfc 进行编译,输出 render 函数;
  • <style> 部分会使用 css-loader 和 style-loader 处理。

接下来我们重点看一下对 <template> 的处理:T1y28资讯网——每日最新资讯28at.com

const { compileTemplate } = require('@vue/compiler-sfc')const compiled = compileTemplate({  source: templateContent,  filename,  id})// 处理编译结果

这里使用了 @vue/compiler-sfc 的 compileTemplate 方法来编译模板,会得到编译后的 render 函数代码。T1y28资讯网——每日最新资讯28at.com

对样式部分的处理也类似,使用 compileStyle 方法编译生成 CSS 代码。T1y28资讯网——每日最新资讯28at.com

通过这种方式,vue-loader 最终输出浏览器可执行的 JS 代码和 CSS 样式代码,以及一些模块之间的依赖关系,供 webpack 进行模块合并打包。T1y28资讯网——每日最新资讯28at.com

综上,我们看到 vue-loader 的主要工作就是调用 @vue/compiler-sfc 对每个部分进行编译,输出浏览器可用的代码。并利用 webpack 的模块机制,输出浏览器可用的 bundle。T1y28资讯网——每日最新资讯28at.com

这种做法的优点是:T1y28资讯网——每日最新资讯28at.com

  • 将组件的三部分代码进行了逻辑上的分割,更清晰;
  • 编译过程可以复用compiler模块,并做缓存等优化;
  • 可以方便地对每个部分使用不同的 loader 做深度处理。

通过源码分析,我们可以更深入理解 vue-loader 的工作原理,以及 Vue SFC 的编译过程。这可以帮助我们更好地掌握单文件组件的开发方式,编写规范的组件代码。T1y28资讯网——每日最新资讯28at.com

4大厂面试回答

在大厂面试中经常会出现这个问题,那么需要在下面几个方面进行回答:T1y28资讯网——每日最新资讯28at.com

  • 说明Vue项目中,Webpack的作用是打包构建Vue组件、资源等,输出浏览器可执行的代码。
  • 介绍在Vue项目中,使用vue-loader来解析Vue的单文件组件(.vue文件)。
  • 解释vue-loader会将单文件组件的模板编译为render函数,脚本部分编译为JS代码,样式提取为CSS代码。
  • 举例说明vue-loader对组件模板的编译过程,使用了@vue/compiler-sfc的compileTemplate方法。
  • 概述对组件脚本的处理,会经过babel转译,解析ES6等代码为ES5。
  • 描述对样式的处理,使用CSS加载器提取并处理为浏览器可用的CSS。
  • 解析出组件之间的依赖关系,输出给Webpack进行模块打包。
  • 总结Webpack通过vue-loader解析组件,输出经过优化的浏览器可执行代码。

下面就是可以详细回答的内容:T1y28资讯网——每日最新资讯28at.com

在Vue项目中,Webpack的作用是对代码进行模块打包和构建,最终输出浏览器可以直接执行的JavaScript代码。为了实现这个目的,Webpack需要解析Vue的单文件组件,也就是以.vue结尾的文件。T1y28资讯网——每日最新资讯28at.com

Webpack通过vue-loader来专门处理Vue组件的解析。vue-loader会将单文件组件分割成三部分,分别是模板代码、脚本代码和样式代码。对于模板部分,vue-loader会使用@vue/compiler-sfc中的compileTemplate方法把模板编译成render函数,这是Vue实际运行时使用的渲染逻辑。对于脚本部分,会使用babel对其进行编译和转换,输出符合ES5标准的JavaScript代码。样式部分则会通过CSS加载器进行处理,最终提取并生成浏览器可用的CSS样式。T1y28资讯网——每日最新资讯28at.com

在解析组件的过程中,vue-loader还会分析出组件之间的依赖关系,例如组件导入了其它子组件等。这些依赖关系的信息会输出给Webpack,用于其进一步进行模块Resolve和依赖收集,最终生成浏览器可执行的JavaScript代码。T1y28资讯网——每日最新资讯28at.com

所以,Webpack通过vue-loader解析Vue组件,对不同部分应用不同的加载器进行转换和处理,输出一个优化且浏览器可执行的JavaScript包,以及所需的CSS、资源等,从而实现了对整个Vue项目的构建和打包。这大大简化了Vue项目的开发流程。T1y28资讯网——每日最新资讯28at.com

5总结

总结来说,vue-loader 为 Vue 单文件组件提供了非常好的 webpack 支持。通过分析它的源码,可以让我们对 Vue SFC 的编译过程有一个更清晰全面的理解,加深对 Vue 开发的掌握。理解其工作原理也有助于我们更好地运用它,解决实际开发中遇到的问题。T1y28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-5197-0.html三言两语说透webpack对vue的编译

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Go-Zero 是如何做路由管理的?

下一篇: Springboot整合GraphQL使你的API更易理解可读性更强

标签:
  • 热门焦点
  • 对标苹果的灵动岛 华为带来实况窗功能

    对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 6月iOS设备性能榜:M2稳居榜首 A系列只能等一手3nm来救

    6月iOS设备性能榜:M2稳居榜首 A系列只能等一手3nm来救

    没有新品发布,自然iOS设备性能榜的上榜设备就没有什么更替,仅仅只有跑分变化而产生的排名变动,毕竟苹果新品的发布节奏就是这样的,一年下来也就几个移动端新品,不会像安卓厂商,一
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • K6:面向开发人员的现代负载测试工具

    K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌在KDD 2023发表了一篇工作,探索了推荐系统ranking模型的训练稳定性问题,分析了造成训练稳定性存在问题的潜在原因,以及现有的一些提升模型稳定性方法的不足,并提出了一种新
  • 一篇文章带你了解 CSS 属性选择器

    一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 使用LLM插件从命令行访问Llama 2

    使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
Top