vue-loader是一个webpack的loader;可以将vue文件转换为JS模块;
(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能带来一个现代。灵活并且非常强大的前端工作流程;
(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原理后会感觉到它是这么强大,可以大大的优化你的前端工作流程;缺点是配置比较复杂;
.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>
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已经为你做了这些;
当
<style scoped>
.example {
color: red;
}
style>
<template>
<div class="example">hidiv>
template>
转换结果
<style>
.example[data-v-f3f3eg9] {
color: red;
}
style>
<template>
<div class="example" data-v-f3f3eg9>hidiv>
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 },这样几乎没有性能影响。
在< 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
}
}
}
]
}
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')()]
}
}
]
}
}
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', //