vue中computed的实现
vue 中的 computed 属性的值只有当内部依赖的 data 属性变化时才会重新求值,这是怎么做到的呢。假设传入以下 computed :
1 | computed: { |
以下是 vue 初始化的操作:
1 | export function initState (vm: Component) { |
vue 中的 computed 属性的值只有当内部依赖的 data 属性变化时才会重新求值,这是怎么做到的呢。假设传入以下 computed :
1 | computed: { |
以下是 vue 初始化的操作:
1 | export function initState (vm: Component) { |
预处理:创建一个词法环境(LexicalEnvironment,在后面简写为LE),扫描JS中的用声明的方式声明的函数和用var定义的变量,将它们加到预处理阶段的词法环境中去。
1 | var a = 1;//用var定义的变量,以赋值 |
在预处理时上面代码创建词法作用域可以这样表示:
1 | LE { // 此时的LE相当于window |
关于 this 指向,部分情况要区分严格模式和非严格模式(正常模式):
你想要什么,事实是什么,如何实现愿望。考察影响你的那些事物的规律,理解背后的因果关系,并利用之。
命令 | 作用 |
---|---|
git reset [commit] | 重置当前分支的指针为指定 commit,同时重置暂存区,但工作区不变 |
git reset –hard | 重置暂存区与工作区,与上一次 commit 保持一致 |
git add [file1] … (git add [dir]) | 添加指定文件(目录)到暂存区 |
git rm [file1] … | 删除工作区文件,并且将这次删除放入暂存区 |
git commit -m [message] | 提交暂存区到仓库区 |
git branch | 列出所有本地分支 |
git branch -r | 列出所有远程分支 |
git branch -a | 列出所有本地分支和远程分支 |
git branch [branch-name] | 新建一个分支,但依然停留在当前分支 |
git branch -d [branch-name] | 删除分支 |
git checkout -b [branch] | 新建一个分支,并切换到该分支 |
git push origin [local_branch]:[remote_branch] | 将本地分支推送到远程 |
git checkout [branch-name] | 切换到指定分支,并更新工作区 |
git checkout - | 切换到上一个分支 |
git checkout [file] | 恢复暂存区的指定文件到工作区 |
git merge [branch] | 合并指定分支到当前分支 |
git tag [tag] | 新建一个 tag 在当前 commit |
git log(git reflog) | 显示当前分支的(最近)版本历史 |
git diff HEAD | 显示工作区与当前分支最新 commit 之间的差异 |
git push origin [branch] | 上传本地指定分支到远程仓库 |
git checkout
可以缩写为gco
HEAD
指向当前分支,HEAD^n
表示当前分支的第 n 个父提交,HEAD~n
表示当前分支的第 n 个父提交,用于第一父母存在歧义的情况下
Koa2 的源码 相当的简短,因为抽离了路由、模板引擎等模块,只提供一个架子,而几乎所有的功能都需要由第三方中间件完成。阅读时建议对照源码。
1 | . lib |
底层原理同 express,即代理http.createServer(requestHandler)
中的requestHandler
,使用中间件来处理请求。
打开 Express4 的源码,目录结构很清晰,阅读时建议对照源码。
1 | . lib |
Express 框架建立在 node.js 内置的 http 模块上,http 模块生成服务器的原始代码如下。
1 | var http = require("http"); |
Express 代理了http.createServer(requestHandler)
中的requestHandler
,并使用注册后的中间件和路由,匹配响应传来的用户请求。
首先实现一个基础结构,每一个 Promise 实现,都有状态标识,以及存放成功与失败回调函数的数组。为什么要使用数组来存放回调函数呢,是考虑到了下面这种情况。
1 | var p3 = new Promise((resolve, reject) => |
1 | function Promise(executor) { |
resolve/reject
负责异步修改 promise 的状态并触发 onResolvedCallback/onRejectedCallback
中的回调函数。为什么要异步触发呢,是为了保证在触发回调前,所有的回调函数都已经被 then 注册。
vuex 中的 store 本质就是没有 template 的隐藏着的 vue 组件,所有配置的 state、actions、mutations 以及 getters 都是其组件的属性,所有的操作都是对这个组件进行的。
vuex 仅仅是作为 vue 的一个插件而存在,不像 Redux、MobX 等库可以应用于所有框架,vuex 只能使用在 vue 上,很大的程度是因为其高度依赖于 vue 的 computed 依赖检测系统以及其插件系统。
每一个 vue 插件都需要有一个公开的 install 方法,vuex 的 install 方法中调用了 applyMixin 方法,该方法在组件的 beforeCreate 生命周期中混入了一个操作:在实例上挂载了一个$store
属性指向store
对象。
1 | // src/store.js |
作为新手不熟悉python
如何引入本地的模块,经过一番折腾,基本明白了引入方式。
假设有一个项目,目录结构如下:
1 | . root_dir |