vue-loader 细节
vue-loader 能根据 .vue 文件,导入一个vue组件。我这里从 vue-cli 的构建项目中抽取了vue-loader 一个小例子出来:vuedemo/demo02
vue-loader 自带postcss的依赖,也就是说被引入的 .vue 组件中的css 会被postcss处理,但需要自己手动添加一个postcss的配置文件:
// .postcssrc.js
module.exports = {
"plugins": {
"autoprefixer": {}
}
}
以上配置了自动添加浏览器前缀,能正常运行。
简要介绍下 postcss:
PostCSS 的主要功能只有两个:第一个就是前面提到的把 CSS 解析成 JavaScript 可以操作的 AST,第二个就是调用插件来处理 AST 并得到结果。以上就是使用的autoprefixer插件,处理的效果如下:
#content {
display: flex;
}
// after
#content {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
}
由于 CSS 规范的制定和完善一般需要花费比较长的时间,浏览器厂商在实现某个 CSS 新功能时,会使用特定的浏览器前缀来作为正式规范版本之前的实验性实现。比如 Webkit 核心的浏览器使用-webkit-,微软的 IE 使用-ms-。为了兼容不同浏览器的不同版本,在编写 CSS 样式规则声明时通常需要添加额外的带前缀的属性
资料参考:
https://vuejs.org/v2/guide/installation.html
https://webpack.js.org/configuration/resolve/
vue的库文件分为两大类:compiler和runtime。前者用于把template(template选项以及 .vue 文件中template区域)编译到render函数中,而后者仅仅支持vue框架的运行处理,不支持前者的模板转换过程,运行时最终执行的都是render函数。
所以,如果按中不包含template,就可以仅仅引入runtime库就可以了,否则要引入full(compiler + runtime)
对于以上仓库中的例子,如果不在webpack配置文件中指定引入 full版本的文件 :
resolve: {
extensions: [".vue",".js",".json"],
alias: {
'vue$': 'vue/dist/vue.js',
}
},
打包后运行就会出现这个错误:
[Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.
因为默认引入vue的是runtime版,不支持 .vue 文件中的template转换。
https://cn.vuejs.org/v2/guide/render-function.html
https://cn.vuejs.org/v2/guide/deployment.html
使用vue单文件组件都是通过vue-loader来引入的,这里记录一些细节
自动实现了template到render函数的转换
在一个vue组件中,组件的html代码可以通过template属性或render函数来指定,两者的区别在于,template会转换为render函数来执行,也就是说最终执行的都是render函数。
所以在生产环境中,可以先进行编译,这样生产环境中运行就不再需要动态转换,性能可以提高一些。
vue-loader默认做了这个转换过程,打包后的bundle文件有如下代码 :
//...
"use strict";
var render = function() {
var _vm = this
var _h = _vm.$createElement
var _c = _vm._self._c || _h
return _c("div", { staticClass: "wrapper" }, [
_c("div", { staticClass: "container" }, [
_vm.loginPage
? _c(
"form",
{
attrs: { action: "" },
on: {
submit: function($event) {
$event.preventDefault()
_vm.login($event)
}
}
},
// ....
.vue (单文件组件)中的template已经被转换了。实现以上过程实际上是vue-loader 内 调用了vue-template-compiler 。在vue-loader/template-compiler/index.js 中有对vue-template-compiler 进行引用
处理css
.vue 文件中 style表内的样式默认都是通过js动态写入到head中,如果这个js较慢才执行,则屏幕可能出现闪屏现象,而且对浏览器缓存不友好。解决办法是使用extract-text-webpack-plugin插件。
启用scss
The vue config in webpack-simple works for
lang="scss"(after installing sass-loader and node-sass), but it does not include the ExtractTextPlugin.
只需要安装sass-loader 和 node-sass 之后在style标签上添加一个lang="scss"即可
vue-loader 细节的更多相关文章
- vue 快速入门 系列 —— vue loader 下
其他章节请看: vue 快速入门 系列 vue loader 下 CSS Modules CSS Modules 是一个流行的,用于模块化和组合 CSS 的系统.vue-loader 提供了与 CSS ...
- Vue Loader
介绍 允许为 Vue 组件的每个部分使用其它的 webpack loader,例如在 <style> 的部分使用 Sass 和在 <template> 的部分使用 Pug(模板 ...
- vue 快速入门 系列 —— vue loader 上
其他章节请看: vue 快速入门 系列 vue loader 上 通过前面"webpack 系列"的学习,我们知道如何用 webpack 实现一个不成熟的脚手架,比如提供开发环境和 ...
- vue 快速入门 系列 —— vue loader 扩展
其他章节请看: vue 快速入门 系列 vue loader 扩展 在vue loader一文中,我们学会了从零搭建一个简单的,用于单文件组件开发的脚手架.本篇将在此基础上继续引入一些常用的库:vue ...
- vue经验 - 细节小知识点汇总(更新中...)
1. $refs 数据这么绑定的: 然后在created中抛出来,猜猜看看打印的是两个什么? 结果如下: 第一个跑出来了,第二个,却undefiend,没有东西?!... 后来去官网查看$refs的解 ...
- vue的细节
1.如果使用路由跳转到别的界面的话,例如从文章list页面跳转到具体文章查看详情页,查看某一个具体就需要传递那个文章的id去后台查询, this.$router.push的params方法可以实现传递 ...
- Vue 使用细节收集
JSX 中 on 开头的属性名 在用 elementui 中的 el-upload 的时候,他们组件中有一个属性 on-change ,也不知道谁想出来的属性名,太扯淡了,非要 on 开头,我开始的代 ...
- vue路由细节探讨
1.使用router-link 不会让页面刷新,使用a标签会使页面刷新.2.router-link 里面的to="/路由地址" tag=""自定义标签" ...
- 理理Vue细节
理理Vue细节 1. 动态属性名:可使用表达式来设置动态属性名或方法名: <!-- 属性name --> <a :[name]="url"> ... < ...
- 配置webpack loader vue 报错:Module build failed: TypeError: this._init is not a function
单文件组件 引入时报错 配置webpage.config.js中的vue 需要如下写法 { test: /\.vue/, loader: "vue-loader", } 之前写的l ...
随机推荐
- 如何修改hosts文件并生效
hosts文件位置C:\Windows\System32\drivers\etc(可以建立一个.bat 的文件把(start "" C:\Windows\System32\driv ...
- 【Nginx】解决Post请求变Get的问题
默认情况下Nginx会把post请求做一次重定向操作,然后后端收到的就成了Get请求,还会导致一些参数的遗漏. 日志如下: 172.16.1.108 - - [11/Jan/2019:18:27:09 ...
- <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
那么 pageEncoding , contentType 分别用来做什么那?在解释之前让我们先了解下jsp从被请求到响应经历的三个阶段: 第一阶段:将jsp编译成Servlet(.java)文件.用 ...
- UWP 后台保存图片
在做UWP的时候,有一个需求,就是点击下载按钮,需要将当前页面中的Image控件中显示的图片保存下来. 既然聊到了下载图片,索性把添加图片也讲一下. 一:给Image控件添加图片 xaml代码: &l ...
- URAL 7077 Little Zu Chongzhi's Triangles(14广州I)
题目传送门 题意:有n根木棍,三根可能能够构成三角形,选出最多的三角形,问最大面积 分析:看到这个数据范围应该想到状压DP,这次我想到了.0010101的状态中,1表示第i根木棍选择,0表示没选,每一 ...
- MySQL、SqlServer、Oracle三大主流数据库分页查询 (MySQL分页不能用top,因为不支持)
一. MySQL 数据库 分页查询MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了.LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它 ...
- Java中“==”的使用,以及“==”和equal的比较
int i02=59 ,这是一个基本类型,存储在栈中. Integer i03 =Integer.valueOf(59); 因为 IntegerCache 中已经存在此对象,所以,直接返回引用. In ...
- poj2455Secret Milking Machine(二分+最大流)
链接 二分距离,小于当前距离的边容量+1,使最后流>=t 注意 会有重边 #include <iostream> #include<cstdio> #include< ...
- UVALive - 6428(扩展欧几里德)
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=48388 前段时间偶然碰到的一道题,今天突然想到没把它记录下来. 比较不错的扩 ...
- 05.NopCommerce给Topic表添加排序及类别字段
在用到Nopcommerce中静态页面表时,发现Topic表没有排序字段和类别字段,导致如果Page文件很多的话,无法区分是哪个类别,为此我稍微扩展了一下字段,在此记录一下操作流程,方便以后自己查看, ...