来聊聊 Vue Loader

2019-10-11  本文已影响0人  smalike

Vue Loader

https://vue-loader.vuejs.org/zh/

Vue Loader 是什么?

Vue Loader 是一个 webpack 的 loader,它允许你以一种名为单文件组件 SFC的格式撰写 Vue 组件:

<template>
  <div class="example">{{ msg }}</div>
</template>
<script>
export default {
  data () {
    return {
      msg: 'Hello world!'
    }
  }
}
</script>
<style>
.example {
  color: red;
}
</style>

Vue Loader 还提供了很多酷炫的特性:

简而言之,webpack 和 Vue Loader 的结合为你提供了一个现代、灵活且极其强大的前端工作流,来帮助撰写 Vue.js 应用。

如果你不想手动设置 webpack,我们推荐使用 Vue CLI 直接创建一个项目的脚手架。通过 Vue CLI 创建的项目会针对多数常见的开发需求进行预先配置,做到开箱即用。

处理资源路径

当 Vue Loader 编译单文件组件中的 <template> 块时,它也会将所有遇到的资源 URL 转换为 webpack 模块请求

<img src="../image.png">

https://github.com/webpack-contrib/css-loader

转换规则

资源 URL 转换会遵循如下规则:

<img src="~some-npm-package/foo.png">

转换资源 URL 的好处是:

@ 别名在 .vue <style> 里无法加载图片的问题

https://github.com/vuejs/vue-loader/issues/1113

Scoped CSS

<style> 标签有 scoped 属性时,它的 CSS 只作用于当前组件中的元素。

<style scoped>
.example {
  color: red;
}
</style>
<template>
  <div class="example">hi</div>
</template>

转换结果:

<style>
.example[data-v-f3f3eg9] {
  color: red;
}
</style>
<template>
  <div class="example" data-v-f3f3eg9>hi</div>
</template>

你可以在一个组件中同时使用有 scoped 和非 scoped 样式:

<style>
/* 全局样式 */
</style>
<style scoped>
/* 本地样式 */
</style>

深度作用选择器

如果你希望 scoped 样式中的一个选择器能够作用得“更深”,例如影响子组件,你可以使用 >>> 操作符:

<style scoped>
.a >>> .b { /* ... */ }
</style>

上述代码将会编译成:

.a[data-v-f3f3eg9] .b { /* ... */ }

还有一些要留意

Scoped 样式不能代替 class。考虑到浏览器渲染各种 CSS 选择器的方式,当 p { color: red } 是 scoped 时 (即与特性选择器组合使用时) 会慢很多倍。如果你使用 class 或者 id 取而代之,比如 .example { color: red },性能影响就会消除。

热重载

当使用脚手架工具 vue-cli 时,热重载是开箱即用的。

状态保留规则

代码校验 (Linting)

ESLint

stylelint https://stylelint.io/

Vue 单文件组件 (SFC) 规范
vue-loader 会解析文件,提取每个语言块,如有必要会通过其它 loader 处理,最后将他们组装成一个 ES Module,它的默认导出是一个 Vue.js 组件选项的对象。

选项参考

https://vue-loader.vuejs.org/zh/options.html#选项参考

选项参考这个我们下次再聊~

上一篇下一篇

猜你喜欢

热点阅读