vue-loader学习笔记

1:vue-loader简介

vue-loader是一个webpack的loader;可以将vue文件转换为JS模块;

2:vue-loader特性

(1)ES2015默认支持 
(2)允许对VUE组件的组成部分使用其他webpack loader;比如对< style >使用SASS(编译CSS语言),对< template >使用JADE(jade是一个高性能的模板引擎,用JS实现,也有其他语言的实现—php,scala,yuby,python,java,可以供给node使用) 
(3).vue文件中允许自定义节点,然后使用自定义的loader处理他们 
(4)对< style >< template >中的静态资源当做模块来对待,并且使用webpack loaders进行处理 
(5)对每个组件模拟出CSS作用域 
(6)支持开发期组件的热重载 
在编写vue应用程序时,组合使用webpack跟vue-loader能带来一个现代。灵活并且非常强大的前端工作流程;

3:webpack简介

(1)webpack是一个模块打包工具,他可以将一堆文件中的每个文件都作为一个模块;找出他们的依赖关系,将他们打包为可部署的静态资源; 
(2)使用webpack的loaders,我们可以配置webpack以任何方式去转换所有类型的文件;例如 
A:转换ES2015,CoffeeScript或者TypeScript模块为普通的ES5 CommonJs模块; 
B:可以选择在编译之前检验你的源代码; 
C:将jade模板转换为纯HTML并且嵌入JS字符串中 
D:将SASS文件转换为纯CSS,然后将其转换成JS片段,将生成的CSS作为< style >标签插入页面; 
E:处理html或者CSS中引用的图片。移动到配置的路径中,并且使用MD5 hash重命名; 
(3)当你理解webpack原理后会感觉到它是这么强大,可以大大的优化你的前端工作流程;缺点是配置比较复杂;

4:VUE组件细则

.vue文件是一个自定义的文件类型,用类HTML语法描述一个vue组件,每个.vue组件包含三种类型的顶级语言快< template>< script>< style>,还允许添加自定义的模块;

<template>
  <div class="example">{{ msg }}</div>
</template>

<script>
export default {
  data () {
    return {
      msg: 'Hello world!'
    }
  }
}
</script>

<style>
.example {
  color: red;
}
</style>

<custom1>
  This could be e.g. documentation for the component.
</custom1>

 vue-loader会解析文件,提取出每个语言块,如果有必要会通过其他loader处理,最后将他们组装成一个commonjs模块;module.exports出一个vue.js组件对象; 
vue-loader支持使用非默认语言,比如CSS预处理器,预编译的HTML模板语言,通过设置语言块的lang属性;例如

<style lang='sass'>
    /*sass*/
</style>

1:< temlate>语言块 
(1)默认语言:html 
(2)每个.vue文件最多包含一个< template>块 
(3)内容将被提取为字符串,将编译用作VUE组件的template选项; 
2:< script> 
(1)默认语言:JS(在监测到babel-loader或者buble-loader配置时,自动支持ES2015) 
(2)每个.vue文件最多包含一个< script>块 
(3)该脚本在类CommonJS环境中执行(就像通过webpack打包的正常JS模块)。所以你可以require()其他依赖。在ES2015支持下,也可以使用import跟export语法 
(4)脚本必须导出Vue.js组件对象,也可以导出由VUE.extend()创建的扩展对象;但是普通对象是更好的选择; 
3:< style> 
(1)默认语言:css 
(2)一个.vue文件可以包含多个< style>标签 
(3)这个标签可以有 scoped 或者 module属性来帮助你讲样式封装到当前组件;具有不同封装模式的多个< style>标签可以在同一个组件中混合使用 
(4)默认情况下,可以使用style-loader提取内容,并且通过< style>标签动态假如文档的< head>中,也可以配置webpack将所有的styles提取到单个CSS文件中; 
4:自定义块 
可以在.vue文件中添加额外的自定义块来实现项目的特殊需求;例如< docs>块;vue-loader将会使用标签名来查找对应的webpack loaders来应用到对应的模块上;webpack需要在vue-loader的选项loaders中指定; 
以上4个模块的导入方式 
如果你喜欢分隔你的.vue文件到多个文件中,你可以通过src属性导入外部文件;

<template src='./template.html'></template>
<style src='./style.css'></style>
<script src='./script.js'></script>

5:ES2015

1:当项目中配置了babel-loader或者buble-loader,vue-loader会使用它们处理所有.vue文件中的< script>部分,允许我们在VUE组件中使用ES2015;如果你还没有使用ES2015,你应该使用它;

<template>
    <Component-a><Component-a>
    <Component-b><Component-b>
<template>
<script>
import ComponentA from './ComponentA.vue'
import ComponentB from './ComponentB.vue'

export default {
  components: {
    ComponentA,
    ComponentB
  }
}
</script>

2:在 Templates 中使用 ES2015

<li v-for="{ id, text } in items">
  {{ id }} {{ text }}
</li>
<my-component>
  <template scope="{ id, text }">
    <span>{{ id }} {{ text }}</span>
  </template>
</my-component>

 3:vue-loader只处理.vue文件,你需要告诉webpack如何使用babel-loader或者buble-loader处理.js文件,在webpack中配置babel-loader或者buble-loader;脚手架vue-cli已经为你做了这些;

6: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跟non-scoped styles

<style>
/* global styles */
</style>

<style scoped>
/* local styles */
</style>

CSS 作用域不能代替 classes。考虑到浏览器渲染各种 CSS 选择器的方式,当使用 scoped 时,p { color: red } 在作用域中会慢很多倍(即当与属性选择器组合时)。如果你使用 classes 或者 ids 代替,比如 .example { color: red },这样几乎没有性能影响。

7:CSS模块

在< style>上添加module属性,将为css-loader打开CSS模块模式;生成的CSS对象将为组件注入一个名叫$style的计算属性,可以在模块中使用动态的class绑定;由于他是一个计算属性,它也适用于:class的object/array语法

<template>
  <p :class="$style.red">
    This should be red
  </p>
</template>
<template>
  <div>
    <p :class="{ [$style.red]: isRed }">
      Am I red?
    </p>
    <p :class="[$style.red, $style.bold]">
      Red and bold
    </p>
  </div>
</template>
<style module>
.red {
  color: red;
}
.bold {
  font-weight: bold;
}
</style>

<script>
export default {
  created () {
    console.log(this.$style.red)
  }
}
</script>

 自定义注入名称

<style module="a">

</style>

<style module="b">

</style>

配置 css-loader Query

CSS 模块处理是通过 css-loader。默认 query 如下:

{
  modules: true,
  importLoaders: true,
  localIdentName: '[hash:base64]'
}

你可以使用 vue-loader 的 cssModules 选项去为 css-loader 添加 query 配置:

// webpack 2
module: {
  rules: [
    {
      test: '\.vue$',
      loader: 'vue-loader',
      options: {
        cssModules: {
          localIdentName: '[path][name]---[local]---[hash:base64:5]',
          camelCase: true
        }
      }
    }
  ]
}

8:PostCSS

vue-loader处理的CSS输出,都是通过PostCSS进行作用域重写,还可以为PostCSS添加自定义插件,

module.exports = {
  // other options...
  module: {
    // module.rules is the same as module.loaders in 1.x
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        // vue-loader options goes here
        options: {
          // ...
          postcss: [require('postcss-cssnext')()]
        }
      }
    ]
  }
}

9:预处理器

1:CSS

npm install sass-loader node-sass --save-dev
<style lang="sass">
  /* write sass here */
</style>

与名称相反,sass-loader 默认解析 SCSS 语法。如果你想要使用 SASS 语法,你需要配置 vue-loader 的选项:

{
  test: /\.vue$/,
  loader: 'vue-loader',
  options: {
    loaders: {
      scss: 'vue-style-loader!css-loader!sass-loader', // <style lang="scss">
      sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax' // <style lang="sass">
    }
  }
}

2:JS 
Vue 组件中的所有 JavaScript 默认使用 babel-loader 处理。你也可以改变处理方式:

npm install coffee-loader --save-dev
<script lang="coffee">
  # Write coffeescript!
</script>

3:template 
模版的处理方式略有不同,因为大多数 Webpack 模版处理器(比如 pug-loader)会返回模版处理函数,而不是编译的 HTML 字符串,我们使用原始的 pug 替代 pug-loader:

npm install pug --save-dev
<template lang="pug">
div
  h1 Hello world!
</template>

重要: 如果你使用 vue-loader@<8.2.0, 你还需要安装 template-html-loader。

10:资源路径处理

默认情况下,vue-loader 使用 css-loader 和 Vue 模版编译器自动处理你的样式和模版文件。在编译过程中,所有的资源路径例如 , background: url(…) 和 @import 会作为模块依赖。

例如,url(./image.png) 会被转换为 require(‘./image.png’) 
因为 .png 不是一个 JavaScript 文件,你需要配置 Webpack 使用 file-loader 或者 url-loader 去处理它们。vue-cli 脚手器工具已经为你配置好了

使用它们的好处: 
(1)file-loader 可以指定要复制和放置资源文件的位置,以及如何使用版本哈希命名以获得更好的缓存。此外,这意味着 你可以就近管理你的图片文件,可以使用相对路径而不用担心布署时URL问题。使用正确的配置,Webpack 将会在打包输出中自动重写文件路径为正确的URL。

(2)url-loader 允许你有条件将文件转换为内联的 base-64 URL(当文件小于给定的阈值),这会减少小文件的 HTTP 请求。如果文件大于该阈值,会自动的交给 file-loader 处理。

11:Loader 进阶配置

module.exports = {
  // other options...
  module: {
    // module.rules 与 1.x中的 module.loaders 相同
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          // `loaders` 覆盖默认 loaders.
          // 以下配置会导致所有的 <script> 标签 "lang" 属性失效。
          // attribute to be loaded with coffee-loader
          loaders: {
            js: 'coffee-loader'
          },

          // `preLoaders` 会在默认 loaders 之前加载.
          // 你可以用来预处理语言块 - 一个例子是用来处理构建时的 i18n
          preLoaders: {
            js: '/path/to/custom/loader'
          },

          // `postLoaders` 会在默认 loaders 之后加载.
          //
          // - 对于 `html`, 默认 loader 返回会编译为 JavaScript 渲染函数
          //
          // - 对于 `css`, 由`vue-style-loader` 返回的结果通常不太有用。使用 postcss 插件将会是更好的选择。
          postLoaders: {
            html: 'babel-loader'
          }

          // `excludedPreLoaders` 应是正则表达式
          excludedPreLoaders: /(eslint-loader)/
        }
      }
    ]
  }
}

12:提取CSS文件

npm install extract-text-webpack-plugin --save-dev



// webpack.config.js
var ExtractTextPlugin = require("extract-text-webpack-plugin")

module.exports = {
  // other options...
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          loaders: {
            css: ExtractTextPlugin.extract({
              use: 'css-loader',
              fallback: 'vue-style-loader' // <- 这是vue-loader的依赖,所以如果使用npm3,则不需要显式安装
            })
          }
        }
      }
    ]
  },
  plugins: [
    new ExtractTextPlugin("style.css")
  ]
}

猜你喜欢

转载自blog.csdn.net/qq_41999617/article/details/83007001