工程化特性
- 组织
- 优化
- 构建
- 维护
PostCSS
作用
- 模块化
- 加前缀
- 兼容性
- …
特点
- PostCSS本身只有解析能力
- 各种特性全靠插件
- 目前至少有200多个插件
常用插件
- import 模块合并
- autoprefixier 自动添加前缀
- cssnano 压缩代码
- cssnext 使用css新特性
- precss 变量、mixin、循环等
content + padding + border + margin
? box-sizing
display 确定元素的显示类型
block/inline/inline-block
position 确定元素的位置
static/relative/absolute/fixed
用 float + margin1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.container{
width:800px;
height:200px;
}
.left{
background:red;
/* float:left; */
/* height:100%; */
width:200px;
position: absolute;
height:200px;
}
.right{
background:blue;
float:right;
width:200px;
height:100%;
}
.middle{
margin-left:200px;
margin-right:200px;
}
</style>
</head>
<body>
<div class="container">
<div class="left">
左
</div>
<div class="right">
右
</div>
<div class="middle">
中间
</div>
</div>
</body>
</html>
布局的核心是–如何进行元素的横向排列
:
,伪元素用::
略
名称 | 说明 |
---|---|
v-if v-else | 是否加载html中的DOM |
v-show | 是否用display属性显示出来 |
v-for | 循环渲染 |
v-text v-html | 输出text 输出html |
v-on | 绑定事件监听,缩写@ |
v-model | 双向绑定,修饰符.lazy 、.number 、.trim |
v-bind | 绑定标签的属性,缩写: |
其它 v-pre,v-cloak,v-once | 输出原始值,渲染整个DOM后再显示,渲染一次 |
什么是全局API?
全局API并不在构造器里,而是先声明全局变量或者直接在Vue上定义一些新功能,Vue内置了一些全局API,比如Vue.directive。说的简单些就是,在构造器外部用Vue提供给我们的API函数来定义新的功能。
名称 | 说明 |
---|---|
Vue.extend | 使用基础 Vue 构造器,创建一个“子类” |
Vue.nextTick | 在下次 DOM 更新循环结束之后执行延迟回调 |
Vue.set | 向响应式对象中添加一个属性 |
Vue.delete | 删除对象的属性 |
Vue.directive | 注册或获取全局指令 |
Vue.filter | 注册或获取全局过滤器 |
Vue.component | 注册或获取全局组件 |
Vue.use | 安装 Vue.js 插件 |
Vue.mixin | 全局注册一个混入 |
Vue.compile | 在 render 函数中编译模板字符串。只在独立构建时有效 |
Vue.version | 提供字符串形式的 Vue 安装版本号 |
名称 | 说明 |
---|---|
data | Vue 实例的数据对象 |
props | 用于接收来自父组件的数据 |
propsData | 创建实例时传递 props。主要作用是方便测试。 |
computed | 计算属性将被混入到 Vue 实例中 |
methods | methods 将被混入到 Vue 实例中 |
watch | 一个对象,键是需要观察的表达式,值是对应回调函数 |
名称 | 说明 |
---|---|
el | 提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标 |
render | 一个字符串模板作为 Vue 实例的标识使用 |
renderError | 当 render 函数遭遇错误时,提供另外一种渲染输出 |
名称 | 说明 |
---|---|
beforeCreate | 在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。 |
created | 在实例创建完成后被立即调用。 |
beforeMount | 在挂载开始之前被调用 |
mounted | el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。 |
beforeUpdate | 数据更新时调用,发生在虚拟 DOM 打补丁之前。 |
updated | 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。 |
beforeDestroy | 实例销毁之前调用。在这一步,实例仍然完全可用。 |
destroyed | Vue 实例销毁后调用。 |
activated | keep-alive 组件激活时调用。 |
deactivated | keep-alive 组件停用时调用。 |
名称 | 说明 |
---|---|
directives | 包含 Vue 实例可用指令的哈希表。 |
filters | 包含 Vue 实例可用过滤器的哈希表。 |
components | 包含 Vue 实例可用组件的哈希表。 |
名称 | 说明 |
---|---|
parent | 指定已创建的实例之父实例,在两者之间建立父子关系 |
mixins | 选项接受一个混入对象的数组。 |
extends | 允许声明扩展另一个组件 |
provide / inject | 提供/注入 主要为高阶插件/组件库提供用例 |
下面是说明如何在 VS Code 中对 vue 代码进行检查和自动修复
1 | { |
1 | yarn add -D eslint eslint-plugin-vue |
在 .eslintrc
中配置
1 | { |
参考链接
下面是说明通过 Vue CLI 生成的 Vue.js 应用程序中,如何使用 VS Code 的 Debugger for Chrome 扩展进行调试
打开 config/index.js
并找到 devtool
属性。将其更新为:
1 | devtool: 'source-map', |
配置 .vscode/launch.json
1 | { |
npm start
启动项目 我在调试中碰到了返回 500 Internal Privoxy Error 的情况,后来发现是代理工具 shadowsocks 代理模式设置为全局模式的原因,把模式修改为 PAC 模式后便可正常调试了。
参考链接
我在公司的业务主要有三种:
业务上基本形成了稳定的套路,这时候开发一套自己的脚手架工具是必要的
一方面是为了业务需要,一方面是为了练手,决定仿照vue-cli写一个脚手架工具。
vue-cli 整体思路:
阅读vue-cli的代码,代码思路如下:
vue
命令会执行 package.json
下的 bin
中指定的文件,也就是 bin/vue
。这个文件中主要用到 commander
这个包,这个包可以用来设置不同的命令。vue init
执行 bin/vue-init
。vue init
根据你输入的官方模版或者远程仓库中的模板名下载模版,用到的包是 download-git-repo
。template
目录,这里面是模版,有 meta.js
或者 meta.json
文件,里面的是配置内容,会被 inquirer
这个包使用,进行交互式问答,后面根据问答结果渲染模版。metalsmith
这个包根据问答内容渲染模版,这里还用到了模版引擎 handlers
。1 | /template # ------ 模版 |
1 | /bin # ------ 命令执行文件 |
nodejs内置了对命令行操作的支持,node工程下package.json中的bin字段可以定义命令名和关联的执行文件。
1 | { |
经过这样配置的nodejs项目,在使用-g选项进行全局安装的时候,会自动在系统的[prefix]/bin
目录下创建相应的符号链接(symlink)关联到执行文件。如果是本地安装,这个符号链接会生成在./node_modules/.bin
目录下。这样做的好处是可以直接在终端中像执行命令一样执行nodejs文件。关于prefix
,可以通过npm config get prefix
获取。
在bin目录下创建一个hxlz.js文件,用于处理命令行的逻辑。
1 | #!/usr/bin/env node |
ommander支持git风格的子命令处理,可以根据子命令自动引导到以特定格式命名的命令执行文件,文件名的格式是[command]-[subcommand]
,例如:
hxlz init => hxlz-init
在bin目录下创建一个hxlz-init.js文件
1 | #!/usr/bin/env node |
新建lib/download.js
文件,用于下载模版
1 | const download = require('download-git-repo') |
使用Promise的风格处理异步
对hxlz-init.js
进行修改
1 | const download = require('./lib/download') |
这里直接使用了vue-cli的ask.js
文件
这里还用到了模版引擎handlebars
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26const Metalsmith = require('metalsmith')
const Handlebars = require('handlebars')
module.exports = function (metadata = {}, src, dest = '.') {
if (!src) {
return Promise.reject(new Error(`无效的source:${src}`))
}
return new Promise((resolve, reject) => {
Metalsmith(process.cwd())
.metadata(metadata)
.clean(false)
.source(src)
.destination(dest)
.use((files, metalsmith, done) => {
const meta = metalsmith.metadata()
Object.keys(files).forEach(fileName => {
const t = files[fileName].contents.toString()
files[fileName].contents = new Buffer(Handlebars.compile(t)(meta))
})
done()
}).build(err => {
err ? reject(err) : resolve()
})
})
}
通过一些工具包,让脚手架更加人性化。这里介绍两个在vue-cli中发现的工具包:
参考链接