简介
sed是一个流编辑器,将文件或标准输入的内容作为编辑的对象,对其按照需求进行修改。
sed的总体结构
sed [OPTION]… {script-only-if-no-other-script} [input-file]…
刨个坑,以后填
GitBook是基于git和markdown的的文档和知识库软件,可以帮助你和你的组织、团队建立共享的知识库
下面是GitBook官网(https://www.gitbook.com/)的描述:
1 | npm install gitbook -g |
建议使用gitbook-cli,这样就可以在你电脑的任何地方使用gitbook的命令
1 | npm install -g gitbook-cli |
这里需要注意的是如果要全局安装gitbook-cli,需要先卸载之前已经全局安装过的gitbook
1 | npm uninstall -g gitbook |
GitBook的基本用法非常简单。
gitbook init
初始化书籍目录gitbook serve
编辑书籍然而。。。
卡在第一步了
1 | TypeError [ERR_INVALID_ARG_TYPE]: The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received an instance of Promise |
原因是gitbook跟不上最新版本的NodeJS,使用10版本勉强能用。但又不想为了这么个东西降低版本,因此果断弃坑。
这里有一篇总结了各个版本之间的各种问题:https://xmuli.tech/posts/d7327716/
替代方案是GitBook有个在线版的,https://app.gitbook.com
注册之后可以使用
Yarn 是一个软件包管理器,还可以作为项目管理工具。
无论你是小型项目还是大型单体仓库(monorepos),无论是业余爱好者还是企业用户,Yarn 都能满足你的需求。
Windows : 官网下载后直接安装即可
下载地址: https://yarn.bootcss.com/latest.msi
Mac
可以通过Homebrew包管理工具安装:
1 | brew install node |
也可以通过MacPorts安装:
1 | sudo port install yarn |
可以通过yarn --version
来测试Yarn是否安装成功。
1 | yarn set version latest |
1 | yarn init |
1 | yarn add [package] |
1 | yarn add [package] --dev |
1 | yarn upgrade [package] |
yarn upgrade
可以简写为yarn up
1 | yarn remove [package] |
1 | yarn |
或者
1 | yarn install |
执行yarn install
命令后,会生成一个yarn.lock
文件,
在使用 Yarn 安装、升级、删除依赖项目时,会自动更新到 yarn.lock
文件中。
在实际项目中,yarn.lock
文件也很有用处,我们可以将 yarn.lock
提交到版本库中,其他成员就可以通过 yarn install
获取所有依赖包,这个可以保证大家安装的依赖是完全一致的,避免产生bug。
1 | yarn help |
Yarn Classic (1.x) | Yarn (2.x) | 备注 |
---|---|---|
yarn create |
yarn dlx create-<name> |
yarn create 仍然可以使用,但是官方更推荐使用 yarn dlx |
yarn global |
yarn dlx |
Dedicated section |
yarn info |
yarn npm info |
|
yarn login |
yarn npm login |
|
yarn logout |
yarn npm logout |
|
yarn outdated |
yarn upgrade-interactive |
|
yarn publish |
yarn npm publish |
|
yarn tag |
yarn npm tag |
|
yarn upgrade |
yarn up |
升级所有工作区的包 |
yarn install --production |
yarn workspaces focus --all --production |
需要 workspace-tools 插件 |
Windows : 官网下载后直接安装即可
下载地址: https://nodejs.org/en/download/
Mac
1 | brew install node |
新建一个server.js
的文件,内容如下:
1 | // NodeJS使用require指令来载入http模块 |
然后终端输入:node server.js
npm是NodeJS的包管理工具,类似Python的pip
查看npm版本:
1 | $ npm -v |
升级:
1 | npm install npm -g |
例如,使用npm安装常用的 Node.js web框架模块 express:
1 | npm install express # 本地安装 |
查看安装信息:
1 | npm list -g |
package.json 位于模块的目录下,用于定义包的属性。接下来让我们来看下 express 包的 package.json 文件,位于 node_modules/express/package.json 内容:
1 | { |
package.json属性说明
1 | npm uninstall express |
之后可以使用npm ls
命令查看包是否已经卸载完成
1 | npm update express |
1 | npm search express |
使用npm init
命令来发布模块
1 | npm init |
输入提示的各项内容后生成了package.json
文件:
1 | ➜ node_sample cat package.json |
使用npm adduser
来在npm资源库中注册用户
1 | ➜ node_sample npm adduser |
然后我们就可以使用npm publish
来发布模块了。
npm help <command>
可查看某条命令的详细帮助,例如npm help install。npm update <package>
可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。npm update <package> -g
可以把全局安装的对应命令行程序更新至最新版。npm cache clear
可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。npm unpublish <package>@<version>
可以撤销发布自己发布过的某个版本代码。使用以下命令来使用淘宝的cnpm
1 | npm install -g cnpm --registry=https://registry.npm.taobao.org |
Node自带了交互式解释器,输入node
即可,可以执行读取、执行、循环等功能
1 | npm install hexo-cli -g |
前提:需要安装好node.js和git
1 | # hexo init 需要在一个空文件夹执行 |
然后访问: http://localhost:4000 就可以看到页面了
1 | hexo clean |
1 | hexo new "New Post" |
1 | hexo server |
1 | hexo generate |
1 | hexo deploy |
需要修改_config.yml
,添加远程发布配置参数
1 | # Deployment |
npm i –save hexo-wordcount
1 | # 清理、生成、本地发布 |
可以从(https://hexo.io/themes/)下载主题,下载到themes
目录下,然后修改_config.yml
文件中的theme
为对应的主题名称(文件夹名)即可:
1 | theme: hexo-theme-matery |
使用hexo-abbrlink
实现URL地址再编码:
1 | npm install hexo-abbrlink --save |
配置:
1 | url: http://sjdt.gitee.io |
Gitee Pages 是一个免费的静态网页托管服务,您可以使用 Gitee Pages 托管博客、项目官网等静态网页。如果您使用过 Github Pages 那么您会很快上手使用 Gitee 的 Pages服务。目前 Gitee Pages 支持 Jekyll
、Hugo
、Hexo
编译静态资源。
注意需要在下面的位置申请开通 Gitee Pages服务,需要实名认证并上传证件图片并等待一个工作日审核
开通后需要建立一个与用户名相同的仓库,比如我的用户名为sjdt,
那么我的gitee page 仓库地址就是:[git@gitee.com:sjdt/sjdt.git]
1 | python -m playwright install |
playwrite文档:https://playwright.dev/python/docs/intro/
将你的Gitee用户名和密码添加到环境变量的gitee_username
和gitee_username
环境变量中,
然后就可以使用下面的脚本自动提交并更新GiteePages了。
1 | #!/usr/bin/env python3 |
移动端常用UI组件库
PC端常用UI组件库
安装:
1 | npm i element-ui |
使用:
1 | // 引入ElementUI |
注意:完整引入会导致chunk-vendors.js
体积庞大,一般按需引入即可
babel-plugin-component
1 | npm install babel-plugin-component |
修改babel.config.js
1 | module.exports = { |
修改main.js
,按需引入组件:
1 | // 引入ElementUI的部分组件 |
Proxy
替代defineProperty
实现响应式Tree-shaking
TypeScript
vue-cli
创建1 | vue create vue3cli |
vite
创建一个开发服务器,它基于 原生 ES 模块 提供了 丰富的内建功能,如速度快到惊人的 模块热更新(HMR)。
一套构建指令,它使用 Rollup 打包你的代码,并且它是预配置的,可以输出用于生产环境的优化过的静态资源。
Vite 意在提供开箱即用的配置,同时它的 插件 API 和 JavaScript API 带来了高度的可扩展性,并有完整的类型支持。
Vite 网站:
官网:[vitejs.dev]https://vitejs.dev/
中文网:vitejs.cn
优势:
1 | # 创建工程 |
Vue3的开发者工具同Vue2不同,需要单独重新安装。
setup
是所有Composition API(组合API)
表演的舞台setup
中setup
函数的两种返回值:data
、methods
、computed
…)中可以访问到setup中的属性、方法。data
、methods
、computed
…)setup
优先async
函数,因为返回值不再是return
的对象,而是Promise
,模板看不到return
对象中的属性。Vue2的data、methods、computed在Vue3中还是可以使用的,但是不推荐
Vue2的方法中读取Vue3中的数据和方法没有问题
但是Vue3的setup中读取不到Vue2的数据和方法
1 | export default { |
渲染函数
1 | // 引入渲染函数 |
简写方式
1 | // 引入渲染函数 |
Vue3中需要通过ref函数来实现响应式。ref函数返回的是一个RefImpl
对象。
作用:定义一个响应式的数据
语法:const xxx = ref(initValue)
xxx.value
<div>{{xxx}}</div>
备注:
Object.defineProperty()
的get
与set
完成的。reactive
函数,封装ES6的Proxy
来实现的。示例:
1 | <template> |
作用: 定义一个对象类型的响应式数据,(基本类型不要用它,要用ref
函数)
语法:const 代理对象 = reactive(源对象)
接收一个对象(或数组),返回一个代理对象(Proxy对象)
reactive定义的响应式数据是“深层次的”。
内部基于ES6的Proxy实现,通过代理对象操作源对象内部数据进行操作
实例:
template
1 | <h2>姓名:{{ person.name }}</h2> |
1 | import { reactive } from "vue"; |
实现原理
Object.defineProperty()
对属性的读取、修改进行拦截(数据劫持)。1 | Object.defineProperty(data, 'count', { |
存在问题
实现原理
通过Proxy(代理):拦截对象中任意属性的变化,包括:属性值的读写、属性的添加、属性的删除等。
通过Reflect(反射):对被代理对象的属性进行操作。
MDN文档中描述的Proxy与Reflect:
1 | new Proxy(person, { |
window.Reflect
1 | obj |
ref
用来定义:基本数据类型reactive
用来定义: 对象(或数组)类型数据ref
也可以用来定义对象(或数组)类型数据,它内部会通过reactive
转为代理对象ref
通过Object.deineProperty()
的get
与set
来实现响应式数据劫持reactivve
通过使用Proxy
来实现响应式数据劫持,并通过Reflect
操作源对象内部的数据ref
定义的数据:操作数据需要.value
,读取数据是模板中直接读取不需要.value
reactive
定义的数据:操作数据与读取数据均不需要.value
this.$attrs
。this.$slots
。this.$emit
。computed函数
与Vue2中computed配置功能一致
写法:
1 | <template> |
Vue2.x的方式
1 | watch: { |
Vue3.x的写法:
1 | <script> |
两个小坑:
watch的套路时:既要指明监视的属性,也要指明监视的回调。
watchEffect的套路是:不用指明监视哪个属性,监视的回调中用到哪个属性,那就监视哪个属性。
watchEffect有点像computed:
1 | // watchEffect所指定的回调中用到的数据只要发生变化,则直接重新执行回调。 |
与Vue2.x相比:
beforeDestroy
和destoryed
,换成了beforeUnmount
和unmounted
const name = toRef(person, 'name')
toRefs
与toRef
功能一致,但可以批量创建多个ref对象,语法:toRefs(person)
1 | <template> |
1 | <script> |
作用: 创建一个自定义的ref, 并对其依赖项跟踪和更新触发进行显示控制
实现防抖效果:
1 | <template> |
作用: 实现祖孙间通信
套路: 父组件有一个provide
选项来提供数据,子组件有一个inject
选项来开始使用这些数据
具体写法:
1 | setup(){ |
1 | setup(){ |
isRef
: 检查一个值是否为一个ref
对象isReactive
: 检查一个对象是否是由reactive
创建的响应式代理isReadonly
: 检查一个对象是否是由readonly
创建的只读代理isProxy
: 检查一个对象是否是由reactive
或者readonly
方法创建的代理Teleport是一种能够将我们的组件html结构移动到指定位置的技术
异步引入组件
1 | import {defineAsyncComponent} from 'vue' |
使用Suspense
包裹组件,并配置好default
与fallback
1 | <Suspense> |
Vue2.x有许多全局API和配置
1 | // 注册全局组件 |
Vue3.0中对这些API做出了调整
2.x全局API(Vue) | 3.x实例API(app) |
---|---|
Vue.config.xxxx | app.config.xxxx |
Vue.config.productionTip | 移除 |
Vue.Component | app.component |
Vue.directive | app.directive |
Vue.mixin | app.mixin |
Vue.use | app.use |
Vue.prototype | app.config.globalProperties |
其他改变
Vue2.x写法
1 | .v-enter, |
Vue3.0的写法
1 | .v-enter-from, |
config.keyCodes
v-on.native
修饰符父组件中绑定事件
1 | <my-component |
子组件中声明自定义事件
1 | <script> |
安装:
1 | npm i vue-router |
使用router-link
标签实现路由的切换
1 | <router-link to="/about" class="list-group-item" active-class="active">About</router-link> |
使用router-view
指定组件的呈现位置
1 | <router-view></router-view> |
几个注意点:
pages
文件夹,以班组间通常存放在component
文件夹$route
属性,里面存储着自己的路由信息。$router
属性获取到。1 | export default new VueRouter({ |
1 | <router-link to="/home/news">News</router-link> |
配置路由,声明接收params
参数
1 | { |
传递参数
跳转路由并携带query参数,to的字符串写法
1 | <router-link :to="`/home/message/detail?id=${m.id}&title=${m.title}`">{{m.title}}</router-link> |
跳转路由并携带params参数
1 | <router-link :to="`/home/message/detail/${m.id}/${m.title}`">{{m.title}}</router-link> |
跳转路由并携带query参数,to的对象写法
1 | <router-link :to="{ |
跳转路由并携带params参数,to的对象写法,这里需要注意的是params路由不能使用path,必须使用name方式:
1 | <router-link :to="{ |
作用: 让路由组件更方便的收到参数
1 | { |
作用:不借助<router-link>
实现路由跳转,让路由跳转更灵活
具体编码:
1 | methods: { |
作用:让不展示的路由组件保持挂载,不被销毁
具体编码:
1 | <keep-alive include="News"> |
1 | <keep-alive :include="['News','Message']"> |
作用: 对路由进行权限控制
分类: 全局守卫、独享守卫、组件内守卫
全局守卫:
1 | // 全局前置路由守卫 -- 初始化及每次路由切换之前被调用 |
独享路由守卫:beforeEnter
#
,不美观Vuex是专门在Vue中实现集中式状态(数据)管理的一个Vue插件, 对vue应用中多个组件的共享状态进行集中式的管理(读/写)
也是一种组件间通信的方式,且适用于任意组件间通信。
Github地址:https://github.com/vuejs/vuex
1 | npm i vuex |
src/store/index.js
1 | // 该文件用于创建Vuex中最为核心的store |
main.js
中创建vm时传入store
配置项1 | // 引入Vue |
当state中的数据需要经过加工后再使用时,可以使用getters加工,
在store.js中追加getters配置:
1 | const getters = { |
mapState方法:用于帮助我们映射state中的数据为计算属性:
1 | computed: { |
mapGetters方法: 用于帮助我们映射getters中的数据为计算属性
1 | // 第一种方式:借助mapGetters生成计算属性,从getters中读取数据。(对象写法) |
mapActions方法: 用于帮助我们生成与actions对话的方法,即:包含$store.dispatch(xxx)
的函数
1 | methods:{ |
mapMutations方法:用于帮助我们生成与mutations
对话的方法,即:包含$store.commit(xxx)
的函数
1 |
|
备注:mapActions与mapMutations使用时,若需要传递参数,需要在模板中绑定事件时传递好参数,否则参数是事件对象。
目的: 让代码更好维护,让多种数据分类更加明确
修改:moduleA.js
1 | const moduleAOptions = { |
moduleB.js
1 | export default { |
index.js
1 | // 该文件用于创建Vuex中最为核心的store |
state
数据1 | // 方式1: 自己直接读取 |
getters
数据1 | // 方式1: 自己直接读取 |
dispatch
1 | // 方式1: 自己直接dispatch |
commit
1 | // 方式1: 自己直接commit |
安装axios
1 | npm i axios |
跨域:协议名、主机名、端口号三者不同时浏览器认为跨域了。
server1.js
1 | // node src/server1.js |
server2.js
1 | // node src/server2.js |
然后就可以通过node src/server1.js
和node src/server2.js
来启动服务器。
修改vue的自定义配置文件vue.config.js
方式一:
1 | devServer: { |
方式二:
1 | devServer: { |
默认插槽:
1 | 父组件中: |
具名插槽:
1 | 父组件中: |
作用域插槽:
数据在组件自身,但根据数据生成的结构需要组件的使用者来决定
App.vue
1 | <div class="container"> |
Category.vue
1 | <template> |