2020-12-13
工作一段时间之后,工作的激情、项目实现的动力、技术的追求等都不同程度的到了一个阶段,很容易开始思考自己价值了,相比新人你独特的地方在哪里?
假设你在面试两个人,一个新人一个老手,怎么看出他们的差别呢?他们可能都会对组件库、工程化、各个技术栈侃侃而谈,但是稍微聊聊就能明显区分不同的思考路径了。
比如一个组件库的项目,新人会对实现的效果浓墨重彩,做了多少个组件,里面包含了很多的交互细节等,但是你如果问怎么解决样式继承、TS 提示怎么更灵活,他们无法说的太明白,甚至没有考虑到,因为他的经验里面涉及到的比较少。但是有经验的人会知道实现组件和交互都是线性工作量,只是时间和设计的问题。而协作、新增组件、升级组件等抽象部分才是工作量的大头,这部分会花更多时间,所以在设计的时候尤其要提前考虑,工程化思想、抽象粒度、组件拆分、多态的实现等上的思考才是价值所在。
所以新手和老手做同样的项目,价值的体现在于经验上讲通过实践沉淀出自己的思考,从而能在下次遇到这类问题的时候更容易解决。
类似的还有项目经历、工程化实践、仿制 App 等问题上,重点不在于 show cases,而是 show thinking,不过有时候只有先 show cases,才能 show thinking...
2020-12-12
工作了三年之后,你应该表现出来的:
- 对技术的精通、业务的熟悉、沟通能力、任务拆解能力、全局思考能力
- 任何需求都能准确评估并按计划实现,一个优秀的参与者。
- 能够对项目提供坚强的支持,无论是技术、意见和都能有足够的参与度和靠谱度。
- 能够熟悉整个大项目的关键点和和技术架构,自己负责的部分能够深入且有质量和工程化。
五年之后:
- 独立负责项目:独当一面、逻辑推理、业务梳理、功能实现能力等,而不是仅仅完成别人布置任务。
- 整体的思路很清晰,能够对别人的问询应付自如,能够简练的给别人讲清楚整个项目。
- 对别人提出的需求和假设,能够当场给出靠谱的解决方案、业务评估。前提是被项目和需求大量训练出来的下意识思考,同时涉猎过大量的项目和技术范围。
- 竞争力,能做别人做不到的事情。
2020-12-07
进入到别人深耕多年的领域,就不能按照别人刚开始的玩法,或者相信自己刚开始的认知了,需要不断地学习才能恍然大悟。
比如做应用和游戏的,多年前游戏只要上架就能挣钱,推广也很简单,但是现在满大街的游戏,花钱让别人玩都很难增长。
又比如做网店,多年前只需要把店开起来就有订单,但是现在还在相信自然流量的已经死了很多波了,你需要各种投入和引流才能勉强存活,成本大了很多。
再比如开实体店,多年前做生意只要靠谱都能成,现在都被资本和房租压缩到了极致,如果不拼尽全力很容易就被淘汰了。
这些已知的领域对新人很不友好,因为你能想到的方法都是多年前别人试过的,做成的在提高效率做竞争门槛,而新人必须要不断学习才能知道现在的一线玩法。
2020-11-26
刚创建的项目,在确认已经引入了 React 之后 tsx 文件飘红,看了下
tsconfig.json
,发现一个不认识的选项 jsx: "react-jsx"
,简单看了下挺有意思~~项目用的最新的 React 17 版本,里面涉及到一个重要的改动就是 JSX 的编译。
老版本里面一直习惯的必须在 jsx 语法文件中引入 React,不然会报错,因为语法转换:
// 转换前const App = () => <h1>Hello World</h1>// 转换后,里面包含了 React,必须要手动引入const App = () => React.createElement('h1', null, 'Hello world')
17.0 修改了这个机制,上层使用的时候不变,但是编译过程修改了:
// 转换后,不依赖于显式的 React,编译期自动引入 jsx 运行时import {jsx as _jsx} from 'react/jsx-runtime';function App() {return _jsx('h1', { children: 'Hello world' });}
编辑器检查 ts 语法是依据 Tsdk,Tsdk 依据项目里的 tsconfig.json 配置,这个配置只有 ts 4.1 版本才有,Tsdk 是谁指定的呢?
- 如果命令行执行 eslint,那么可以用全局安装的文件,或者在 nodejs 中引入不同的位置
- 如果是编辑器的语法检查或者插件,需要配置,默认是编辑器自带,可以手动指定
所以如果 tsconfig.json 中配置
jsx: "react-jsx"
,但是 Tsdk 版本小于 4.1 ,不认识这个选项,那么就都报错了。所以使用 React 17 版本的话,可以把配置改成了 react
、指定项目内的 ts、升级编辑器。2020-11-11
任何事情都是有方法论的,怎么解决问题、怎么沟通、怎么实现目标、怎么提效,很多东西都是能够总结出来、或者去学习得到的。就像是机器学习,就算你随机的实践,结果好作为激励,那么每次做的好的路径都是不停改进的方法论。
编程中:
- 每次对接项目都会花很多时间联调,为什么不去找提前对接的方法呢?
- 每次产品提测都是很痛苦的过程,回归测试每次都出问题,为什么不完善代码规范、考虑自动测试等方法呢?
- 产品清单、运行清单、测试清单
- 抽象、规范、流程、标准化、工程化
生活中也是一样:
- 做事不靠谱?那就提高能力、多实践、从而更准确的项目评估,遇到哪些问题然后下次预先考虑。
- 不善沟通?那就多沟通,把负面的心理惩罚降低,让自己更愿意去沟通,从而根据反馈调整自己的应答机制。
- 效率低?那就列出提效清单一个个实践。
遇到问题,那么就封装出一个解决问题的方法,下次遇到就直接调用。要有活跃的反馈和思考,像是一个有返回值的函数,好在哪?不够好在哪?下次怎么能做的更好?像是一个活跃的神经元,接受刺激,反馈信号。 最怕的是你关闭了学习的途径,变得像个老人一样,依靠老的习惯,不愿意找方法。
2020-11-06
猝不及防,在你毫无准备的时候突然宣布一个让你严肃起来的消息,打乱你原本计划的一切。所以可以的话,让自己提前准备好,拥抱变化 😂,或者主动寻求变化。
2020-11-01
- 文章变动立即存储内容和时间到本地,以一分钟粒度创建历史记录,随时可恢复
- 闲置无操作 2s 后再次检查本地存储是否一致无误,以免内容未持久化
- 有未保存到云端的内容时,关闭网页会触发提示组织关闭窗口
- 有未保存内容时强制关闭页面,下次进入能够提示恢复
- 本地内容比服务器内容更新时会主动提示恢复
- 每次保存操作后,会拉取刚保存云端内容,检查本地内容保存是否确认无误
- 删除操作提供标记废纸篓,而不是删除记录,删除操作可以云端恢复
以上内容如果出现错误将会提示用户,除非系统故障、浏览器错误导致本地存储失效,以上的备份机制还是能够做到防丢失的目的。
2020-10-01
非常开心自己的婚礼能有一场盛大的仪式来纪念这个难忘的日子。我一直觉得时间是证明一段感性真挚的方式,而我们用了 6 年的时间来证明了我们的感情,此时此刻我也能够在你的眼睛里看到这份真挚。今天我在此立下誓言,在我们的第 7 年、第 8 年、...第 100 年,我也能看着你的眼睛说 “我爱你”。
此外感谢为了我们两个的婚事忙前忙后、亲力亲为的大家庭的所有人,真的特别完美的一个婚礼,此生难忘。中秋/国庆双节同庆的日子,感谢所有人。
2020-8-09
现在的按钮、组件之类的,都没有了声音好像,音效的播放如果是点击、滑动等用户操作触发的,也不会被浏览器拦截,恰到好处的安排也不会很突兀。
很久之前 flash 页面很多的时候,带有音效的各种操作反馈挺有意思的,后来可能多媒体的支持没跟上、打扰到用户、没需求等,很少看到普通的应用中添加音效了。
客户端应用,比如 MACOS 或者 Windows 系统中包含了很多的操作音效反馈,这确实能够提升更强烈的感官丰富度。
所以:不能被这种约定、大家都不做限制了想象,有时间给组件库加上音效主题,一定很有意思。
2020-7-22
能够看到的很多技术、方案、规范、实现等,都有本质上的原理,初学者可以靠记性记住很多东西,但是原理如果明白了那么久能够融会贯通了。
比如:很多实习生 弄不清楚 Headers、跨域、返回数据解析、API 版本、HTTP 报文等。本质是浏览器和服务器定义的请求响应数据结构的问题。
- 浏览器和服务器的接口沟通走的时候 HTTP,浏览器发什么、服务器返回什么,在遵循 HTTP 规范的前提下都是很自由的。比如浏览器会根据服务器设置的 CORS 头来控制跨域的处理,但是如果不是浏览器来做 HTTP 请求,这个 CORS 头客户端就可能不去遵循。所以说白了这些 Headers 都是参数,其中有浏览器或者业界统一遵循的头规范,也可以自己定义、改写这些参数,然后达到自己的控制目的。
- 从这个角度来看,http 请求的发送,添加 application/json 头,服务器就知道应该返回 JSON 格式数据,如果协商说客户端添加 accept: text/xml 的头参数,服务器只要能控制,也能决定返回 JSON 格式数据,这个不是写死的,而是代码里的约定俗成而已。请求中手动添加 v:2 的参数,服务器也能知道返回高版本的数据响应。
- 再说很多的后端框架,比如 PHP 的 YII/ThinkPHP、JAVA 的 Tomcat 等框架,本身内置了很多的 HTTP 解析模块,能够将约定俗成的头参数进行解析,比如返回数据能够根据 accept 来自动的决定返回 JSON 还是 XML,这个行为是框架封装的,也是代码决定的。
再比如:线程和进程、Docker 的 CPU限制、单线程模型。本质是 CPU 时间的问题。
- 正常一台机器,多任务的处理方案都是 CPU 运行一段时间后切换给其他任务,所以多任务的本质是 CPU 把自己的计算时间给谁的问题,MACOS 的活动监视器中能够看到每个进程所用的 CPU 时间总和。
- docker 或者虚拟机能控制某一个容器或机器最多用多少内存,但是没办法控制最多用多少 CPU,因为 CPU 的计量单位是时间和核,只能控制用几个核心用多久。
- 本质上也是计算送到 CPU,计算完毕之后返回,这个计算时间跟计算量和 CPU 的频率有关,多个容器在一台机器上,机器能分配的是每个容器的优先级和时间分配。
- 单个线程算一个计算,多线程就是将多个计算列队让一个进程循环处理,避免这一个进程出现空闲 CPU 时间,无论再快也是一个个计算,只是避免 CPU 等 IO 的情况,如果多线程全都是 CPU 计算的话,多线程的效率比单线程还要低,因为本质这个进程的 CPU 时间都是跑满的。(相当于三个队排队窗口打饭,如果每个人都要思考吃什么,师傅先给另一个队列打饭就行,整个队列会更快。但是如果每个人不思考上来就能打饭,那么排 100 个队伍打饭师傅也不可能比一个队更快)
- 多进程是利用多核 CPU 核心,每个进程中都能安排计算,每个进程同时有 CPU 时间给这些计算。(相当于窗口有 2 个打饭师傅,无论怎么打饭也比 1 个师傅更快)
- JS 这种单进程的执行逻辑一般都是用的 Event Loop,宏任务和微任务之类的执行逻辑,宏任务中的回调挂起,成功后被放到微任务中,宏任务完毕之后检查微任务,如果宏任务中有密集型的计算任务占据了 CPU 时间,那么用户操作的反馈在微任务中无法被调用响应,那么就会造成了卡顿。
2020-6-12
数据层和视图层的关系,在现在 React 类框架中没有很复杂的实现,甚至无意去着重实现。目前与 View 相关的数据层已经很多了,而基本上这些数据层也仅仅与视图层相关,没办法承载更复杂的东西。
业务本身如果足够复杂的时候,其也本应该有自己的核心数据层,比如很多的前端应用级别的实现,这些实现不可能依赖于业内有一个足够强大、适用、灵活的数据层来普适性的满足,更不能寄希望于 React 这些本身定位是视图层的框架来负责。
这些复杂的业务强相关的数据层是需要业务开发自己实现的,无论是基于目前的方案还是自己手动去撸。
对于数据层的实现和业务关联,目前我在 Novus 中,定义数据模型、动作、副作用,虽然与视图层强相关,重点在数据的聚合、变动和响应,这也足够满足一般意义上的前端业务,甚至涉及到编辑器类的应用级也能够应付大部分情况。而且进一步说,业务的数据层包含复杂输入输出、包含复杂的计算甚至前端侧的 CRUD 等需求,比如游戏等复杂交互和渲染的需求,这个真的跟传统视图层无关,需要有专门的数据层来支持这些模型和交互。
2020-5-23
测试或者个人 demo 用来跳过 CORS:
源码:
2020-5-16
React.ComponentType
// 组件的泛型 propstype CommonFormProps<T> = {name: stringvalue: T}// 带有泛型的函数组件function CommonForm<T>(props: CommonFormProps<T>) => JSX.Element// 添加一个 memo 包裹,可以透传const NewForm = React.memo(NewFormComponent)// ===>// 在使用的时候用 ComponentType + as 来实现泛型的限制const NewString = NewForm as React.ComponentType<CommonFormProps<string>>const NewNumber = NewForm as React.ComponentType<CommonFormProps<number>>
2020-4-29
2020-04-06
- 一个人基于自己的判断决定做某件事
- 这个人对这件事有自己的预期
- 但是事情的发展不符合自己的预期
- 焦虑和严肃随之而来
- way 1
- 顿悟、理智
- 找到明确的方法,坚持下去 / 说服自己跳出框架 / 变更思路
- 逐渐解决问题
- way 2
- 没有有效的解决办法
- 尝试各种办法 keep busy,缓解自己内心的焦虑
- 接受现实
最近看到太多这个心里路径了
2020-3-22
只需要把 github.com 换成 github.githistory.xyz 就可以浏览源代码文件以及它的历史变更,对于看源码怎么一步步的实现的非常友好
2020-2-12
node 的 npm 包安装众所周知的慢,但是在 cnpm 镜像下快很多,或者 yarn 都能解决大部分的网络问题。但是很多 node 模块,比如 node-gyp 等还是依旧的慢,因为其中很多涉及到二进制的 node 文件。这里记录下这个地址:
https://npm.taobao.org/mirrors
,可以使用 mirror-config-china
/binary-mirror-config
自动创建 npmrc 配置这些模块的镜像地址,能节省很多人生时间。2020-2-08
从前有一个城堡,里面的居民每天都要打怪兽才能照顾好自己的生活。我爱的人,她叫小豆芽,很喜欢笑,剑法很不错,每天都能斗志昂扬的去打小怪兽,三两下就能放到的时候,还嫌生活太过平淡。后来她就去挑战了大怪兽了,不过好像有点不太能搞得定,在我的帮助下都被打得经常受伤,一天天的去挑战,偶尔打败了一个,但更多的是受伤,还被别人说打得太慢了,不认输的她都变得怀疑自己,斗志从积极到疲惫,看着特别心疼。早晨太阳升起,我迷迷糊糊的还没睡醒,她红着眼睛小声的跟我说:“我可不可以休息一天,我不喜欢去打怪兽了。”,心疼的紧紧抱住她,我能做的不多,帮她研究剑法,帮她疗伤,逗她开心,她还记得曾经的愿望和梦想,想好了在这个大怪兽身上锻炼出绝世剑法,陪我一起仗剑走天涯,过上自由的生活。大好青春年华,别皱着眉红着眼,享受自己春天的年纪,我来保护你。
2020-1-8
- 录屏使用开源免费的 kap,能导出 mp4 效果比 gif 好很多,可控而且文件更小;
- 原型图之类的使用 Sketch 画图,无论是产品设计还是基本的图表绘图都很不错,导出 svg 直接作为图片引用,不好的地方是文字空格会合并,不过少量文字可以轮廓化,图表比截图展示好很多。
- 字符图使用 asciiflow 不用导出图片,直接使用字符画,简单图形来说更方便些
2019-12-12
我们在
React
里面看到了 useEffect
的 Hook
,在 Redux
里面看到了 Effects
,第一次见可能会一头雾水,这些被称为副作用。其实根据函数式编程,所谓"副作用"(side effect
),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。计算以外的操作都属于 Effect
,典型的就是 I/O 操作、网络请求、数据库读写等,算作除了标准输入之外的输入,可能会影响函数式的状态。2019-12-10
JSX 语法和 React 并不是绑定在一起的东西,既可以只使用 JSX 不使用 React,也可以只用 React 不用 JSX。 JSX 作为一个类 XML 的语法,作为组件和 HTML 的抽象是非常合适的。单独使用 JSX 的时候只需要安装
@babel/plugin-syntax-jsx
让 babel 识别 jsx 语法,再配合其他转换插件,比如 @babel/plugin-transform-react-jsx
或者 vue-jsx
,即可转译为普通的 js 语法了,也可以简单的使用 babel-plugin-transform-jsx
语法:let box = <div />;
=>
var box = {elementName: "div",attributes: {},children: null};
2019-9-29
构建自己的意识壁,和普通人不一样,不轻易否认自己,积极向上,懂得争取些什么
2019-08-01
hooks 的思想是开发者不再需要去理清每一个生命周期函数的触发时机,以及在里面处理逻辑会有哪些影响。而是更关注去思考哪些是状态,哪些是副作用,哪些是需要缓存的复杂计算和不必要的渲染。