本文为拉勾网大前端高薪训练营第一期笔记
(Component-Driven Development)
CDC的好处
root: 获取根组件
parent: 获取父组件
children: 获取所有子组件
ref:拿到组件或者dom
provide&inject: 类似于react的context provider,上层定义一个provide的一些变量,下层任意一层都能inject获取之前provide提供的变量,但是变量不是响应式的,只能获取,不能修改
attrs-listeners:
//parent.vue
//myinput.vue
VueCli中提供了一个插件可以进行原型快速开发
需要先额外安装一个全局的扩展
npm install -g @vue/cli-service-global
使用vue serve快速查看组件的运行效果
vue serve如果不指定参数的话,默认会在当前目录找以下的入口文件
可以指定要加载的组件
vue serve ./src/login.vue
npm init -y
vue add element
//main.js
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import Login from './src/Login.vue'
Vue.use(ElementUI)
new Vue({
el: '#app',
render: h => h(Login)
})
组件分类
//Steps.vue
{
{ index }}
/* steps.css */
.lg-steps {
position: relative;
display: flex;
justify-content: space-between;
}
.lg-steps-line {
position: absolute;
height: 2px;
top: 50%;
left: 24px;
right: 24px;
transform: translateY(-50%);
z-index: 1;
background: rgb(223, 231, 239);
}
.lg-step {
border: 2px solid;
border-radius: 50%;
height: 32px;
width: 32px;
display: flex;
justify-content: center;
align-items: center;
font-weight: 700;
z-index: 2;
background-color: white;
box-sizing: border-box;
}
//Steps-test.vue
//Input.vue
表单验证使用import AsyncValidator from ‘async-validator’
Form里传rules,通过provide传下去
provide () {
return {
form: this
}
},
然后FormItem里使用inject拿到Form,从而拿到rules
inject: ['form'],
两种项目的组织方式
自动安装
npx -p @storybook/cli sb init --type vue
yarn add vue
vue yarn add vue-loader vue-template-compiler --dev
https://www.learnstorybook.com/intro-to-storybook/react/en/get-started/
开启yarn工作区
//package.json
"private": true, //将来提交npm和git禁止把当前根目录内容进行提交
"workspaces": [
"./packages/*"
]
给工作区根目录安装开发依赖
yarn add jest -D -W
-D开发依赖 -W根目录
给指定工作区安装依赖
yarn workspace lg-button add lodash@4
给所有工作区安装依赖
删除子包的node_modules,然后yarn install
会将大部分子包共享的依赖提升到根目录,有版本冲突的子包的依赖会单独安装在子包下的node_modules
lerna是一个优化使用git和npm管理多包仓库的工作流工具
用于管理具有多个包的javascript项目
可以一键把代码提交到git和npm仓库
yarn global add lerna
lerna init
lerna publish
安装依赖
vue test utils
jest
vue-jest
babel-jest
yarn add jest @vue/test-utils vue-jest babel-jest -D -W
//jest.config.js
module.exports = {
testMatch: ['**/__tests__/**/*.[jt]s?(x)'],
moduleFileExtensions: [
'js',
'json'
// Jest `*.vue` "vue"
],
transform: {
// `vue-jest` `*.vue`
'.*\\.(vue)$': 'vue-jest' // `babel-jest` js ".*\\.(js)$": "babel-jest"
}
}
//babel.config.js
module.exports = {
presets: [
[
'@babel/preset-env'
]
]
}
需要注意的是vue-test依赖的babel6,项目里的babel7,这时候需要安装
yarn add babel-core@bridge -D -W
例如
import input from '../src/input.vue'
import { mount } from '@vue/test-utils'
describe('lg-input', () => {
test('input-text', () => {
const wrapper = mount(input)
expect(wrapper.html()).toContain('input type="text"')
})
test('input-password', () => {
const wrapper = mount(input, {
propsData: {
type: 'password'
}
})
expect(wrapper.html()).toContain('input type="password"')
})
test('input-password', () => {
const wrapper = mount(input, {
propsData: {
type: 'password',
value: 'admin'
}
})
expect(wrapper.props('value')).toBe('admin')
})
test('input-snapshot', () => {
const wrapper = mount(input, {
propsData: {
type: 'text',
value: 'admin'
}
})
expect(wrapper.vm.$el).toMatchSnapshot()
})
})
第一次会生成快照,yarn test -u会重新生成快照
安装依赖
举例
import { terser } from 'rollup-plugin-terser'
import vue from 'rollup-plugin-vue'
module.exports = [
{
input: 'index.js',
output: [
{
file: 'dist/index.js',
format: 'es'
}
],
plugins: [
vue({
css: true,
compileTemplate: true
}),
terser()
]
}
]
对workspace下某一个执行npm run build
yarn workspace lg-button run build
如果想一次性打包所有插件
安装依赖
yarn add @rollup/plugin-json rollup-plugin-postcss @rollup/plugin-node-resolve -D -W
@rollup/plugin-node-resolve 把依赖的第三方库打包进来
import fs from 'fs'
import path from 'path'
import json from '@rollup/plugin-json'
import vue from 'rollup-plugin-vue'
import postcss from 'rollup-plugin-postcss'
import { terser } from 'rollup-plugin-terser'
import { nodeResolve } from '@rollup/plugin-node-resolve'
const isDev = process.env.NODE_ENV !== 'production'
// 公共插件配置
const plugins = [
vue({
// Dynamically inject css as a