VUEXX公司系公开发行A股机制是怎么样的?

16年小程序刚出来的时候,就准备花点时间去学学。无奈现实中手上项目太多,一个接着一个,而且也没有开发小程序的需求,所以就一拖再拖。
直到上周,终于有一个小程序的项目。如果现在学小程序,时间上肯定来不及了(就给了一周的时间)。正好前段时间看到美团开源了一个使用vue来开发微信小程序的框架 mpvue。因为平时vue用的多,所以就决定使用 mpvue 来开发。
mpvue 介绍
我们看一下mpvue官网上的介绍:
是一个使用 Vue.js 开发小程序的前端框架。框架基于 Vue.js 核心,mpvue 修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序环境中,从而为小程序开发引入了整套 Vue.js 开发体验。
mpvue 优势
彻底的组件化开发能力:提高代码复用性
完整的 Vue.js 开发体验
方便的 Vuex 数据管理方案:方便构建复杂应用
快捷的 webpack 构建机制:自定义构建策略、开发阶段 hotReload
支持使用 npm 外部依赖
使用 Vue.js 命令行工具 vue-cli 快速初始化项目
H5 代码转换编译成小程序目标代码的能力
通过 Vue.js 命令行工具 vue-cli,你只需在终端窗口输入几条简单命令,即可快速创建和启动一个带热重载、保存时静态检查、内置代码构建功能的小程序项目:
# 创建一个基于 mpvue-quickstart 模板的新项目
$ vue init mpvue/mpvue-quickstart my-project
# 安装依赖
$ cd my-project
$ npm install
# 启动构建
$ npm run dev
接下来,你只需要启动微信开发者工具,引入项目即可预览到你的第一个 mpvue 小程序。
下面是一个项目目录结构。
和开发vue完全一样,不过需要注意的是,小程序不支持dom操作,所以vue中的 ref 也不能使用。
其它基础可以看mpvue官网,上面有详细的使用说明。下面主要说一个在开发过程中遇到的坑。
mpvue开发中遇到的问题
1.路由跳转
vue中 使用 vue-router 来进行路由跳转的。mpvue中只需要用 a 标签就行了。
&a href="/page/counter/main?text=123"&
同时也可以使用小程序自身提供的api完成页面跳转
wx.navigateTo({
url: `/pages/counter/main?text=${this.text}`
2.input框光标位置
在input输入框内输入内容时,当我想修改前面已经输入好的文字,把光标移动到需要修改的位置。
修改完之后,光标自动跑到最后了,这样给用户体验不好。
&input type="text" v-model="text"&
可以使用 v-model.lazy 但是 lazy 在输入框失去焦点时才能触发。可以使用setTimeout来延迟执行。
&input type="text" v-model.lazy="text"&
setTimeout(() =& {
let ipt = this.
这样就能解决了。
3.弹出层滚动穿透
写了一个简单的弹窗,发现滚动弹出层里的内容,后面的内容也跟着滚动。开始以为阻止冒泡就行了。结果试了一下,还是不行。在 issues 里看到别人提供的解决办法,试了一下,可以用。
&scroll-view :scroll-y="scroll" style="height:200px" scroll-with-animation="true"&
&-- 弹出层 --&
&div class="layer"&
&/scroll-view&
点击弹窗按钮时,把 scroll 设置为 false。 点击关闭按钮时,再把 scroll 设置为true 。同时设置body的样式
overflow-y:
height: 100%;
4.引入echarts 打包后文件过大
项目中需要引入echarts,直接引入后,打包完体积超过 2M了,没办法提交。echarts提供的有精简版本,我们可以导入精简的版本。
import echarts from "echarts/dist/echarts.simple.min";
import mpvueEcharts from "mpvue-echarts";
具体的 echarts 使用,请看文档,有详细的介绍。
5.页面加载生命周期
当从一个页面跳转到另一个页面时,我们在新页面不能使用created来初始化获取接口返回的内容。
因为小程序首次加载会把所以页面的created都执行。
我们可以使用下面方法
async onLoad() {
如果之前使用过vue,那么使用mpvue来开发小程序上手非常快,基本上可以无缝对接。
mpvue目前还是有坑的,不过后面迭代的版本功能会越来越完善。
阅读(...) 评论()客服热线:400-995-7855
深挖数字资产安全痛点 VUEX推动数字资产交易安全技术
& 17:52&&来源:互联网&
  根据权威统计机构数据表示,市值超过1亿人民币的数字资产高达400多种。这种新型数字资产的大量涌现以及参与数字资产投资的用户数量激增带来了极其旺盛的交易需求。针对这种需求的快速发展,巨大市场空白的潜在盈利机会,让大量创业者开始在数字资产交易领域布局,目前市场上日均交易量超过一亿人民币的数字资产交易所已经超过了60家。
  而在众多区块链入局者中,有一家定位于&高度自治社区&,致力打造全球化优质数字资产交易的平台&&VUEX,在探索区块链交易世界的创新交易撮合方式,建立技术壁垒,深度服务全球区块链交易,基于交易平台的全面自治社区生态体系,为区块链这一新世界提供全方位服务。
  (VUEX官网)
  品牌口碑打响市场 上线当天涌入大量注册用户
  据了解,VUEX交易平台公测版本在日当天上线,为了更加深入了解VUEX,我们查阅了VUEX的白皮书资料,通过初步的分析判断可以知道,VUEX交易平台的成功之处可能是因为他们做了大胆的、突破性的创新。VUEX通过&流动性挖矿&的模式,鼓励用户参与价格发现的过程,打造高效的交易生态,同时会有50%的VUT(VU Token)奖励给社区用户,打造高效的交易生态。VUT持有者可参与社区的投票、选举等活动,社区的重大决策亦需要VUT持有者的参与,保证了平台的优秀流动性。
  作为品牌名称,VUEX里的V是Value(价值),代表了VUEX是数字资产价值发现、价值交换的平台;U则是Union(联盟)的意思,代表了将以交易所为平台,VUEX联合包括项目方、用户在内的所有数字货币的参与者,打造一个健康的、社区自治的、具有自我进化能力的数字资产社区生态。VUEX团队表示,VUEX希望不断扩大并为国内外城市带来加密货币交换和促进经济发展。加密数字货币交易所,是从根本上与传统金融世界运作方式所区分,带来更加繁荣的推动力,可以更好的保护数字加密货币的安全和增值。
  (社区自治 VUT持有者都有决策权)
  安全技术特点鲜明 有助引领数字资产交易专业化
  据VUEX数字资产交易中心负责人介绍,团队坚持专心做好产品,提升用户体验,完善交互细节,用产品力说话。VUEX的网站专注于提升用户的交互体验外,更重要的是强化所提供的产品和服务,让用户的资产安全和管理效率大为提升。 在保障用户的数字资产安全方面,VUEX将其作为最高优先级的事项。更加强大的安全系统,包括但不限于强密码需求、多重校验、单独资金密码以及身份验证等。在采用多重签名比特币钱包的用户资产分离方案下,保证VUEX用户绝大部分数字货币存储在多重签名冷钱包,小部分比特币存储在热钱包,如此严格的安全设定,让VUEX用户的数字资产安全滴水不漏。
  在致力于区块链加密数字资产更加美好的愿景下,为VUEX投资者和使用者提供安全、便捷、可靠的交易服务;提供多资产形态、多维度业务、全币种交易、跨平台合作的综合交易市场;打造高开放、强兼容、快流通的数字化区块生态服务系统,这些都成为了VUEX的主要目标。
  (VUEX促进国内外城市经济发展)
  当看到加密数字货币的持续增长,VUEX希望更多的人加入这个数字世界,因为可能将会有一套新规则来治理我们越来越数字化的经济。区块链是一个去中心化的经济机制,这意味着我们有机会运用新的技术,来更好地发挥经济活动中的治理效率,带来对社会福利的贡献。
扫一扫关注A5创业网公众号
责任编辑:陈龙
下一篇: 没有了
2018年区块链无疑已成为当今全球最为火热的话题,各大行业与区块链相结合纷纷加速了行业的发展,通过去中心化和去信用化,除了极大地降低了信息的传递速度和交易成本,给人类带来极大的便利,它已将是未来发展的一个重要趋势。
传统游戏发展至今,也存在本身的局限性。大众玩家和传统游戏之间产生对立关系,同时每款游戏用户的流失速度也变得越来越快。这样的结果对大众玩家,对游戏公司都是不好的。那么要如何改变这种局面呢?区块链的出现,就给了传统游戏行业一个新思路。“区块链+游戏”的模式,也能解决大众玩家和游戏开发商之间的不信任关系。
贪欲和创新,我不知这是否也可以说是金融。对比三百年前的发币逻辑,实质上今天并没有改变,变的只是花哨的抢劫方法。今年5月,国内横空出世的交易所FCoin,一手用贪欲把流量思维用到极致,努力的在已划分好的版图上生生撕开一道口子。
在进一步讨论区块链形态与应用的同时,短视频作为互联网风口也是备受关注。罗江春表示,除了娱乐,短视频更可以成为知识、技能的传播载体,引人思考,提高生活品质,与区块链相一样,短视频的未来还拥有更多的积极的、正向的可能。
我们生活在这个时代,不断的接受新的事物,新的科技,新的···那这个时代发展的到底有多快?世界第1台计算机诞生到互联网的开启,不过44年;从门户网站到电子商务崛起不过5年;现在,物联网、区块链和大数据在各个领域和行业得到广泛营运
区块链势头那么好,大家都想入局区块链,区块链到底能不能解决你企业现在所面临的问题呢?下面我们一起来看下区块链技术能解决的问题有哪些。
以「区块赋能,链接未来」为主题的中美创投峰会区块链论坛于美国当地时间7月21日下午在硅谷成功举办。本次大会由金融科技专业资讯平台链闻ChainNews,携手传播中国声音的权威媒体人民网旗下创新创业投资机构人民创投联合举办。
币圈里最怕的事,就是你和他说项目,他和你谈情怀,你和他说市值,他和你说未来。你质问一根大阳线,为何他家币种纹丝不动?他回答,无可奉告。币圈项目门槛极低,人们甚至不需要分析基本面,就能在“一币一别墅,一币一嫩模”的投机流言中失去理性判断,继而被各种空气币手起刀落。投真实项目的难度,堪比在某多多平台挑到
近日,因核心子公司长春长生违法违规生产冻干人用狂犬病疫苗,长生生物被推到了风口浪尖,好比德国突袭波兰成为第二次世界大战的导火索一般,长生生物过往的各类疫苗造假事件被一一曝出,股票一度跌停,相关领导人也受到刑拘调查。
据悉,今年吴金霖等人利用在深圳注册的兆云数字资产(深圳)有限公司的工商营业执照,谎称获得数字资产牌照,并于今年4月份发行“兆云金”虚拟货币开始传销骗局。该传销模式主要为采用会员推荐、缴纳会费等方式,让投资者购买“兆云金”虚拟货币。
根据权威统计机构数据表示,市值超过1亿人民币的数字资产高达400多种。这种新型数字资产的大量涌现以及参与数字资产投资的用户数量激增带来了极其旺盛的交易需求。
2018年区块链无疑已成为当今全球最为火热的话题,各大行业与区块链相结合纷纷加速了行业的发展,通过去中心化和去信用化,除了极大地降低了信息的传递速度和交易成本,给人类带来极大的便利,它已将是未来发展的一个重要趋势。
传统游戏发展至今,也存在本身的局限性。大众玩家和传统游戏之间产生对立关系,同时每款游戏用户的流失速度也变得越来越快。这样的结果对大众玩家,对游戏公司都是不好的。那么要如何改变这种局面呢?区块链的出现,就给了传统游戏行业一个新思路。“区块链+游戏”的模式,也能解决大众玩家和游戏开发商之间的不信任关系。
贪欲和创新,我不知这是否也可以说是金融。对比三百年前的发币逻辑,实质上今天并没有改变,变的只是花哨的抢劫方法。今年5月,国内横空出世的交易所FCoin,一手用贪欲把流量思维用到极致,努力的在已划分好的版图上生生撕开一道口子。
在进一步讨论区块链形态与应用的同时,短视频作为互联网风口也是备受关注。罗江春表示,除了娱乐,短视频更可以成为知识、技能的传播载体,引人思考,提高生活品质,与区块链相一样,短视频的未来还拥有更多的积极的、正向的可能。
创业好项目
扫描二维码关注A5创业网了解最新创业资讯服务
&徐州八方网络科技有限公司&版权所有&
举报投诉邮箱:
扫一扫关注最新创业资讯&figure&&img src=&https://pic1.zhimg.com/v2-fbb5bd355d4334dfc2ed7_b.jpg& data-rawwidth=&1360& data-rawheight=&726& class=&origin_image zh-lightbox-thumb& width=&1360& data-original=&https://pic1.zhimg.com/v2-fbb5bd355d4334dfc2ed7_r.jpg&&&/figure&&p&&b&译者按:&/b& 你可能已经用到Underscore或者Lodash。本文列举了11个常用的库来提高开发效率。&/p&&ul&&li&原文: &a href=&http://link.zhihu.com/?target=https%3A//blog.bitsrc.io/11-javascript-utility-libraries-you-should-know-in-fb31ade& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&11 Javascript Utility Libraries You Should Know In 2018&/a&&/li&&li&译者: &a href=&http://link.zhihu.com/?target=https%3A//fundebug.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Fundebug&/a&&/li&&/ul&&p&&b&为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。&/b&&/p&&p&JavaScript依然是2018年最受欢迎、最流行的编程语言,所以它的生态系统也十分完善。&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-e6f4b051f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&725& data-rawheight=&453& class=&origin_image zh-lightbox-thumb& width=&725& data-original=&https://pic4.zhimg.com/v2-e6f4b051f_r.jpg&&&/figure&&p&&br&&/p&&p&JavaScript小小的标准库不足以应付各种开发需求。在Github上,有许多流行的JavaScript库。在这里,我整理了一个列表推荐给大家:&/p&&h2&&b&1. Underscore & Lodash(dah)&/b&&/h2&&p&也许大多数童鞋都已经知道它们。Underscore提供了日常使用的基础函数。Lodash, 作为NPM最多下载量和被依赖最多的包,提供了更加支持跨环境一致性的对数组、字符串、对象和参数对象的支持。它已经是Underscore的超集。Underscore和Lodash有同一组核心开发者维护。你日常开发中绝对少不了要用到它。&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//github.com/lodash/lodash& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Lodash&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//github.com/jashkenas/underscore& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Underscore&/a&&/li&&/ul&&h2&&b&2. Ramda&/b&&/h2&&p&拥有超过12K的stars,Ramda库可以用来在JavaScript中函数式编程,专门为函数式编程风格而设计,更容易创建函数式 pipeline、且从不改变用户已有数据。&/p&&p&摘自官方:&/p&&blockquote&&i&Ramda 主要特性如下:&/i&&/blockquote&&ul&&li&&i&Ramda 强调更加纯粹的函数式风格。数据不变性和函数无副作用是其核心设计理念。这可以帮助你使用简洁、优雅的代码来完成工作。&/i&&/li&&li&&i&Ramda 函数本身都是自动柯里化的。这可以让你在只提供部分参数的情况下,轻松地在已有函数的基础上创建新函数。&/i&&/li&&li&&i&Ramda 函数参数的排列顺序更便于柯里化。通常最后提供要操作的数据。&/i&&/li&&/ul&&p&&br&&/p&&blockquote&&i&最后两点一起,使得将多个函数构建为简单的函数序列变得非常容易,每个函数对数据进行变换并将结果传递给下一个函数。Ramda 的设计能很好地支持这种风格的编程。&/i&&/blockquote&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//github.com/ramda/ramda& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Ramda&/a&&/li&&/ul&&p&你也可以看看:&a href=&http://link.zhihu.com/?target=https%3A//github.com/facebook/immutable-js/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&immutable.js&/a&&/p&&h2&&b&3. MathJS&/b&&/h2&&p&拥有超过6K的stars,Math.js是一个Node.js和JavaScript的math扩展库,并且和内置的Math库兼容。该库中包含一个灵活的表达式分析器,并且有非常多的内置函数可以使用。你甚至可以自行做扩展。&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//github.com/josdejong/mathjs& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Math.js&/a&&/li&&/ul&&h2&&b&4. Moment/date-fns&/b&&/h2&&p&拥有超过40K的stars,moment.js是一个JavaScript的时间处理库,可以用来分析、验证、处理和格式化时间。Moment被设计可以用于浏览器和Node.js环境下。对于V2.10.0,代码完全用ECMAScript 6模块实现。&/p&&p&Date-fns也是一个非常流行(超过11K的stars)的时间处理库,提供超过130多个函数,很多人把它当做moment.js(&a href=&http://link.zhihu.com/?target=https%3A//github.com/date-fns/date-fns/issues/275%23issuecomment-& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&查看对比&/a&)的替代品。Date-fns完全用纯函数实现,并保证不可修改性。它可以很好的和webpack,Browserify、或Rollup配合使用,并支持tree-shaking。&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//github.com/moment/moment/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&moment&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//github.com/date-fns/date-fns& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&date-fns&/a&&/li&&/ul&&h2&&b&5. Sugar&/b&&/h2&&p&拥有超过3.5K个stars,Sugar是一个可以用来处理原生对象的库。自定义的构建和模块化的npm包,使得你可以只需要加载你需要的包。用户也可以自定义方法或则使用插件处理特殊情况。&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//github.com/andrewplummer/Sugar& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sugar&/a&&/li&&/ul&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-af8c64ca1d527_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&927& data-rawheight=&238& class=&origin_image zh-lightbox-thumb& width=&927& data-original=&https://pic4.zhimg.com/v2-af8c64ca1d527_r.jpg&&&/figure&&p&&br&&/p&&h2&&b&6. Lazy&/b&&/h2&&p&拥有5K个stars,lazy.js是一个函数式的JavaScript库。该库的底层的实现都是懒执行的,也就是说尽量不做运算,除非站的需要。这个库不依赖第三方库,这里有一个&a href=&http://link.zhihu.com/?target=http%3A//danieltao.com/lazy.js/demos/events/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&demo&/a&,这里是&a href=&http://link.zhihu.com/?target=http%3A//danieltao.com/lazy.js/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&API文档&/a&。&/p&&p&比如,我们要生成300个1到1000之间完全不同的随机数,可以这样写:&br&&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&nx&&Lazy&/span&&span class=&p&&.&/span&&span class=&nx&&generate&/span&&span class=&p&&(&/span&&span class=&nb&&Math&/span&&span class=&p&&.&/span&&span class=&nx&&random&/span&&span class=&p&&)&/span&
&span class=&p&&.&/span&&span class=&nx&&map&/span&&span class=&p&&(&/span&&span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&e&/span&&span class=&p&&)&/span& &span class=&p&&{&/span& &span class=&k&&return&/span& &span class=&nb&&Math&/span&&span class=&p&&.&/span&&span class=&nx&&floor&/span&&span class=&p&&(&/span&&span class=&nx&&e&/span& &span class=&o&&*&/span& &span class=&mi&&1000&/span&&span class=&p&&)&/span& &span class=&o&&+&/span& &span class=&mi&&1&/span&&span class=&p&&;&/span& &span class=&p&&})&/span&
&span class=&p&&.&/span&&span class=&nx&&uniq&/span&&span class=&p&&()&/span&
&span class=&p&&.&/span&&span class=&nx&&take&/span&&span class=&p&&(&/span&&span class=&mi&&300&/span&&span class=&p&&)&/span&
&span class=&p&&.&/span&&span class=&nx&&each&/span&&span class=&p&&(&/span&&span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&e&/span&&span class=&p&&)&/span& &span class=&p&&{&/span& &span class=&nx&&console&/span&&span class=&p&&.&/span&&span class=&nx&&log&/span&&span class=&p&&(&/span&&span class=&nx&&e&/span&&span class=&p&&);&/span& &span class=&p&&});&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&用JavaScript直接去写,代码就会复杂很多了。&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//github.com/dtao/lazy.js& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&lazy.js&/a&&/li&&/ul&&h2&&b&7. CollectJS&/b&&/h2&&p&拥有超过3.5K个stars,collect.js是一个非常有前景并且不依赖于任何第三方库的库。它提供了针对数组和对象的包装,使用非常方便。&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&kr&&const&/span& &span class=&nx&&collection&/span& &span class=&o&&=&/span& &span class=&nx&&collect&/span&&span class=&p&&([{&/span&
&span class=&nx&&name&/span&&span class=&o&&:&/span& &span class=&s1&&'JavaScript: The Good Parts'&/span&&span class=&p&&,&/span& &span class=&nx&&pages&/span&&span class=&o&&:&/span& &span class=&mi&&176&/span&
&span class=&p&&},&/span& &span class=&p&&{&/span&
&span class=&nx&&name&/span&&span class=&o&&:&/span& &span class=&s1&&'JavaScript: The Definitive Guide'&/span&&span class=&p&&,&/span& &span class=&nx&&pages&/span&&span class=&o&&:&/span& &span class=&mi&&1096&/span&
&span class=&p&&}]);&/span&
&span class=&nx&&collection&/span&&span class=&p&&.&/span&&span class=&nx&&avg&/span&&span class=&p&&(&/span&&span class=&s1&&'pages'&/span&&span class=&p&&);&/span&
&span class=&c1&&//=& 636&/span&
&/code&&/pre&&/div&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//github.com/ecrmnn/collect.js/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&collect.js&/a&&/li&&/ul&&h2&&b&8. ChanceJS&/b&&/h2&&p&Chance是一个用来随机生成字符串、数字等的函数,他可以减少一些非随机性,在你需要写自动化测试或则其它你需要生成随机的地方很有用。虽然只要3K个stars,但是这个库真的非常方便。&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-34d5a070c1bb45e44b83dd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&599& data-rawheight=&189& class=&origin_image zh-lightbox-thumb& width=&599& data-original=&https://pic2.zhimg.com/v2-34d5a070c1bb45e44b83dd_r.jpg&&&/figure&&p&&br&&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//github.com/chancejs/chancejs& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&chancejs&/a&&/li&&/ul&&h2&&b&9. ChartJS&/b&&/h2&&p&拥有超过40K的stars,chart.js是一个少即是多的的经典例子。它只提供了8中可视化的类型,每一种都有动画并且可以自定义。Chart.js让你可以使用&code&&canvas&&/code&标签来作图,并且在不同的浏览器上高效渲染。&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//github.com/chartjs/Chart.js& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&chart.js&/a&&/li&&/ul&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-0ef79c2cfdad44b7ed2c3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&773& data-rawheight=&408& class=&origin_image zh-lightbox-thumb& width=&773& data-original=&https://pic4.zhimg.com/v2-0ef79c2cfdad44b7ed2c3_r.jpg&&&/figure&&p&&br&&/p&&h2&&b&10. Polished&/b&&/h2&&p&拥有超过3.5K个stars,由&a href=&http://link.zhihu.com/?target=https%3A//github.com/styled-components/styled-components& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&styled-components&/a&团队开发,Polished是一个用于写css样式的工具集,提供saas风格的帮助函数和mixins。该库和styled-components,Aphrodite,Radium兼容。&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//github.com/styled-components/polished& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&polished&/a&&/li&&/ul&&h2&&b&11. Mout&/b&&/h2&&p&Mout.js是一个JavaScript的模块化工具集合,能够以AMD模块的形式在浏览器中使用或者在Node.js中。Mout.js让你可以只加载你需要的模块或者函数,如下所示:&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&c1&&// you can load individual methods (recommended)&/span&
&span class=&kd&&var&/span& &span class=&nx&&map&/span& &span class=&o&&=&/span& &span class=&nx&&require&/span&&span class=&p&&(&/span&&span class=&s1&&'mout/array/map'&/span&&span class=&p&&);&/span&
&span class=&nx&&map&/span&&span class=&p&&([&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&],&/span& &span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&v&/span&&span class=&p&&){&/span& &span class=&k&&return&/span& &span class=&nx&&val&/span& &span class=&o&&*&/span& &span class=&nx&&val&/span&&span class=&p&&;&/span& &span class=&p&&});&/span& &span class=&c1&&// [1, 4]&/span&
&span class=&c1&&// a single package&/span&
&span class=&kd&&var&/span& &span class=&nx&&stringUtils&/span& &span class=&o&&=&/span& &span class=&nx&&require&/span&&span class=&p&&(&/span&&span class=&s1&&'mout/string'&/span&&span class=&p&&);&/span&
&span class=&nx&&stringUtils&/span&&span class=&p&&.&/span&&span class=&nx&&camelCase&/span&&span class=&p&&(&/span&&span class=&s1&&'Foo Bar'&/span&&span class=&p&&);&/span& &span class=&c1&&// &fooBar&&/span&
&span class=&c1&&// or the whole lib&/span&
&span class=&kd&&var&/span& &span class=&nx&&mout&/span& &span class=&o&&=&/span& &span class=&nx&&require&/span&&span class=&p&&(&/span&&span class=&s1&&'mout'&/span&&span class=&p&&);&/span&
&span class=&nx&&console&/span&&span class=&p&&.&/span&&span class=&nx&&log&/span&&span class=&p&&(&/span& &span class=&nx&&mout&/span&&span class=&p&&.&/span&&span class=&nx&&math&/span&&span class=&p&&.&/span&&span class=&nx&&clamp&/span&&span class=&p&&(&/span&&span class=&mi&&17&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&10&/span&&span class=&p&&)&/span& &span class=&p&&);&/span& &span class=&c1&&// 10&/span&
&/code&&/pre&&/div&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//github.com/mout/mout& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&mout&/a&&/li&&/ul&&h2&&b&12. Voca&/b&&/h2&&p&一个用于处理字符串的JavaScript库,包含了很多的帮助函数,比如:change case, trim, pad, slugify, latinise, sprintf‘y, truncate, escape等等。&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//github.com/panzerdp/voca& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&voca&/a&&/li&&/ul&&h2&&b&13. Licia&/b&&/h2&&p&虽然只有500来个stars,但是Licia提供了非常多的工具函数,对于日常使用非常有帮助。&br&官方介绍:&/p&&blockquote&&i&Licia是一套在开发中实践积累起来的实用JavaScript工具库。该库目前拥有超过180个模块,包括Dom操作,cookie设置,类创建,模板函数,日期格式化等实用模块,同时配套有打包工具Eustia进行定制化,使JS脚本加载量缩减在10KB以下,极大优化移动端页面的加载速度。&/i&&/blockquote&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-a8ac9cb0cdea_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&888& data-rawheight=&275& class=&origin_image zh-lightbox-thumb& width=&888& data-original=&https://pic3.zhimg.com/v2-a8ac9cb0cdea_r.jpg&&&/figure&&p&&br&&/p&&p&Licia由&a href=&http://link.zhihu.com/?target=https%3A//www.surunzi.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RedHood&/a&开发,详细了解可以查看他本人在知乎上写的对Licia的介绍: &a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&超实用JavaScript工具库&/a&。&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//github.com/liriliri/licia& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&licia&/a&&/li&&/ul&&h2&&b&关于Fundebug&/b&&/h2&&p&&a href=&http://link.zhihu.com/?target=https%3A//www.fundebug.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Fundebug&/a&专注于JavaScript、微信小程序、小游戏BUG监控,自从2016年双十一正式上线,Fundebug已经服务了一年半时间,累计处理了5亿+错误事件,得到了众多知名用户的认可。Fundebug支持主流前端框架的bug监控,欢迎各位老铁体验!&/p&&p&&/p&
译者按: 你可能已经用到Underscore或者Lodash。本文列举了11个常用的库来提高开发效率。原文: 译者: 为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。…
&p&react-motion,代码简洁得玄幻,demo炫酷得炸裂,在jsx里用闭包的典范,要弄懂react这套jsx范式相比mvvm那套模板范式到底优越在哪里,这是必读的项目。&/p&&p&&br&&/p&&p&chenglou是个天赋才情极高的程序员。&/p&
react-motion,代码简洁得玄幻,demo炫酷得炸裂,在jsx里用闭包的典范,要弄懂react这套jsx范式相比mvvm那套模板范式到底优越在哪里,这是必读的项目。 chenglou是个天赋才情极高的程序员。
&figure&&img src=&https://pic2.zhimg.com/v2-523cfacbf2d7ade22f55f35_b.jpg& data-rawwidth=&1875& data-rawheight=&1042& class=&origin_image zh-lightbox-thumb& width=&1875& data-original=&https://pic2.zhimg.com/v2-523cfacbf2d7ade22f55f35_r.jpg&&&/figure&&p&&b&背景&/b&&/p&&p&Picasso是大众点评移动研发团队自研的高性能跨平台动态化框架,经过两年多的孕育和发展,目前在美团多个事业群已经实现了大规模的应用。&br&&/p&&p&Picasso源自我们对大前端实践的重新思考,以简洁高效的架构达成高性能的页面渲染目标。在实践中,甚至可以把Native技术向Picasso技术的迁移当做一种性能优化手段;与此同时,Picasso在跨越小程序端和Web端方面的工作已经取得了突破性进展,有望在四端(Android、iOS、H5、微信小程序)统一大前端实践的基础之上,达成高性能大前端实践,同时配合Picasso布局DSL强表达能力和Picasso代码生成技术,可以进一步提升生产力。&/p&&p&&b&客户端动态化&/b&&/p&&p&2007年,苹果公司第一代iPhone发布,它的出现“重新定义了手机”,并开启了移动互联网蓬勃发展的序幕。Android、iOS等移动技术,打破了Web应用开发技术即将一统江湖的局面,之后海量的应用如雨后春笋般涌现出来。移动开发技术给用户提供了更好的移动端使用和交互体验,但其“静态”的开发模式却给需要快速迭代的互联网团队带来了沉重的负担。&/p&&p&&b&客户端“静态”开发模式&/b&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-cd60ef4d4a8eef8e4defeb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&2027& data-rawheight=&574& class=&origin_image zh-lightbox-thumb& width=&2027& data-original=&https://pic4.zhimg.com/v2-cd60ef4d4a8eef8e4defeb_r.jpg&&&/figure&&p&&br&&/p&&p&客户端开发技术与Web端开发技术相比,天生带有“静态”的特性,我们可以从空间和时间两个维度来看。&br&&/p&&p&&b&从空间上看需要集成发布&/b&&/p&&p&美团App承载业务众多,是跨业务合流,横向涉及开发人员最多的公司,虽然开发人员付出了巨大的心血完成了业务间的组件化解耦拆分,但依然无可避免的造成了以下问题:&/p&&ol&&li&&b&编译时间过长。&/b& 随着代码复杂度的增加,集成编译的时间越来越长。研发力量被等待编译大量消耗,集成检查也变成了一个巨大的挑战。&/li&&li&&b&App包体增长过快。&/b& 这与迅猛发展的互联网势头相符,但与新用户拓展和业务迭代进化形成了尖锐矛盾。&/li&&li&&b&运行时耦合严重。&/b& 在集成发布的包体内,任何一个功能组件产生的Crash、内存泄漏等异常行为都会导致整个App可用性下降,带来较大的损失。&/li&&li&&b&集成难度大。&/b& 业务线间代码复用耦合,业务层、框架层、基础服务层错综复杂,需要拆分出相当多的兼容层代码,影响整体开发效率。&/li&&/ol&&p&&b&从时间上看需要集中发布&/b&&/p&&p&线上Bug修复须发版或热修复,成本高昂。新功能的添加也必须等待统一的发版周期,这对快速成长的业务来说是不可接受的。App开发还面临严重的长尾问题,无法为使用老版本的用户提供最新的功能,严重损害了用户和业务方的利益。&/p&&p&这种“静态”的开发模式,会对研发效率和运营质量产生负面影响。对于传统的桌面应用软件开发而言,静态的研发模式也许是相对可以接受的。但对于业务蓬勃发展的移动互联网行业来说,静态开发模式和敏捷迭代发布需求的矛盾日益突出。&/p&&p&&b&客户端动态化的趋势&/b&&/p&&p&如何解决客户端“静态”开发模式带来的问题?&/p&&p&&b&业界最早给出的答案是使用Web技术&/b&&/p&&p&但Web技术与Native平台相比存在性能和交互体验上的差距。在一些性能和交互体验可以妥协的场景,Web技术可以在定制容器、离线化等技术的支持下,承载运营性质的需要快速迭代试错的页面。&/p&&p&&b&另一个业界给出的思路是优化Web实现&/b&&/p&&p&利用移动客户端技术的灵活性与高性能,再造一个“标准Web浏览器”,使得“Web技术”同时具有高性能、良好的交互体验以及Web技术的动态性。这次技术浪潮中Facebook再次成为先驱,推出了React Native技术(简称RN)。不过RN的设计取向有些奇怪,RN不兼容标准Web,甚至不为Android、iOS双端行为对齐做努力。产生的后果就是所有“吃螃蟹”的公司都需要做二次开发才能基本对齐双端的诉求。同时还需要尽最大努力为RN的兼容性问题、稳定性问题甚至是性能问题买单。&/p&&p&&b&而我们给出的答案是Picasso&/b&&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-fc4176cbde62ca2eabe8cf5_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&405& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic3.zhimg.com/v2-fc4176cbde62ca2eabe8cf5_r.jpg&&&/figure&&p&Picasso另辟蹊径,在实现高性能动态化能力的同时,还以较强的适应能力,以动态页面、动态模块甚至是动态视图的形式融入到业务开发代码体系中,赢得了许多移动研发团队的认同。&/p&&p&Picasso框架跨Web端和小程序端的实践也已经取得了突破性进展,除了达成四端统一的大前端融合目标,Picasso的布局理念有望支持四端的高性能渲染,同时配合Picasso代码生成技术以及Picasso的强表达能力,生产力在大前端统一的基础之上得到进一步的提升。&/p&&p&&b&Picasso动态化原理&/b&&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-5cc626e7a9f4bb4b13af7_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&654& data-rawheight=&342& class=&origin_image zh-lightbox-thumb& width=&654& data-original=&https://pic1.zhimg.com/v2-5cc626e7a9f4bb4b13af7_r.jpg&&&/figure&&p&&br&&/p&&p&Picasso应用程序开发者使用基于通用编程语言的布局DSL代码编写布局逻辑。布局逻辑根据给定的屏幕宽高和业务数据,计算出精准适配屏幕和业务数据的布局信息、视图结构信息和文本、图片URL等必要的业务渲染信息,我们称这些视图渲染信息为PModel。PModel作为Picasso布局渲染的中间结果,和最终渲染出的视图结构一一对应;Picasso渲染引擎根据PModel的信息,递归构建出Native视图树,并完成业务渲染信息的填充,从而完成Picasso渲染过程。需要指出的是,渲染引擎不做适配计算,使用布局DSL表达布局需求的同时完成布局计算,即所谓“表达即计算”。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-87c5dad5ac001abfeb5b6_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1145& data-rawheight=&927& class=&origin_image zh-lightbox-thumb& width=&1145& data-original=&https://pic4.zhimg.com/v2-87c5dad5ac001abfeb5b6_r.jpg&&&/figure&&p&从更大的图景上看,Picasso开发人员用TypeScript在VSCode中编写Picasso应用程序;提交代码后可以通过Picasso持续集成系统自动化的完成Lint检查和打包,在Picasso分发系统进行灰度发布,Picasso应用程序最终以JavaScript包的形式下发到客户端,由Picasso SDK解释执行,达成客户端业务逻辑动态化的目的。&/p&&p&在应用程序开发过程中,TypeScript的静态类型系统,搭配VSCode以及Picasso Debug插件,可以获得媲美传统移动客户端开发IDE的智能感知和断点调试的开发体验。Picasso CI系统配合TypeScript的类型系统,可以避免低级错误,助力多端和多团队的配合;同时可以通过“兼容计算”有效的解决能力支持的长尾问题。&/p&&p&&b&Picasso布局DSL&/b&&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-b9a8eca1e79b389a9a1178be_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&788& data-rawheight=&434& class=&origin_image zh-lightbox-thumb& width=&788& data-original=&https://pic3.zhimg.com/v2-b9a8eca1e79b389a9a1178be_r.jpg&&&/figure&&p&&br&&/p&&p&Picasso针对移动端主流的布局引擎和系统做了系统的对比分析,这些系统包括:&br&&/p&&ol&&li&Android开发常用的LinearLayout。&/li&&li&前端及Picasso同类动态化框架使用的&u&&a href=&https://link.zhihu.com/?target=https%3A//developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&FlexBox&/a&&/u&。&/li&&li&苹果公司主推的&u&&a href=&https://link.zhihu.com/?target=https%3A//developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&AutoLayout&/a&&/u&。&/li&&/ol&&p&其中苹果官方推出的AutoLayout缺乏一个好用的DSL,所以我们直接将移动开发者社区贡献的&u&&a href=&https://link.zhihu.com/?target=https%3A//github.com/robb/Cartography& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&AutoLayout DSL&/a&&/u&方案列入对比。&/p&&p&首先从性能上看,AutoLayout系统是表现最差的,随着需求复杂度的增加“布局计算”耗时成指数级的增长。FlexBox和LinearLayout相比较AutoLayout而言会在性能表现上有较大优势。但是LinearLayout和FlexBox会让开发者为了布局方面需要的概念增加不必要的视图层级,进而带来渲染性能问题。&/p&&p&从灵活性上看,LinearLayout和FlexBox布局有很强的概念约束。一个强调线性排布,一个强调盒子模式、伸缩等概念,这些模型在布局需求和模型概念不匹配时,就不得不借助编程语言进行干预。并且由于布局系统的隔离,这样的干预并不容易做,一定程度上影响了布局的灵活性和表达能力。而配合基于通用编程语言设计的DSL加上AutoLayout的布局逻辑,可以获得理论上最强的灵活性。但是这三个布局系统都在试图解决“用声明式的方式表达布局逻辑的问题”,基于编程语言的DSL的引入让布局计算引擎变得多余。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-970bce364cc3de247d58331_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&648& data-rawheight=&595& class=&origin_image zh-lightbox-thumb& width=&648& data-original=&https://pic4.zhimg.com/v2-970bce364cc3de247d58331_r.jpg&&&/figure&&p&Picasso布局DSL的核心在于:&/p&&ol&&li&基于通用编程语言设计。&/li&&li&支持锚点概念(如上图)。&/li&&/ol&&p&使用锚点概念可以简单清晰的设置非同一个坐标轴方向的两个锚点“锚定”好的视图位置。同时锚点可以提供描述“相对”位置关系语义支持。事实上,针对布局的需求更符合人类思维的描述是类似于“B位于A的右边,间距10,顶对齐”,而不应该是“A和B在一个水平布局容器中……”。锚点概念通过极简的实现消除了需求描述和视图系统底层实现之间的语义差距。&/p&&p&下面举几个典型的例子说明锚点的用法:&/p&&p&1. 居中对齐:&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-bff011ebb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&350& data-rawheight=&144& class=&content_image& width=&350&&&/figure&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&
view.centerX = bgView.width / 2
view.centerY = bgView.height /2
&/code&&/pre&&/div&&p&2. 右对齐:&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-1efa50b28791ec6debdfbe6d58bdae3a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&344& data-rawheight=&126& class=&content_image& width=&344&&&/figure&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&
view.right = bgView.width - 10
view.centerY = bgView.height / 2
&/code&&/pre&&/div&&p&3. 相对排列:&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-b7ae7ea32aacf9292525d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&346& data-rawheight=&132& class=&content_image& width=&346&&&/figure&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&
viewB.top = viewA.top
viewB.left = viewA.right + 10
&/code&&/pre&&/div&&p&4. “花式”布局:&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-d01fde162a4e1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&328& data-rawheight=&126& class=&content_image& width=&328&&&/figure&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&
viewB.top = viewA.centerY
viewB.left = viewA.centerX
&/code&&/pre&&/div&&p&Picasso锚点布局逻辑具有理论上最为灵活的的表达能力,可以做到“所想即所得”的表达布局需求。但是有些时候我们会发现在特定的场景下这样的表达能力是“过剩的”。类似于下图的布局需求,需要水平排布4个视图元素、间距10、顶对齐;可能会有如下的锚点布局逻辑代码:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-2e689dadf43cf78b5fe0f7_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&374& data-rawheight=&116& class=&content_image& width=&374&&&/figure&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&
v1.top = 10
v1.left = 10
v2.top = v1.top
v3.top = v2.top
v4.top = v3.top
v2.left = v1.right + 10
v3.left = v2.right + 10
v4.left = v3.right + 10
&/code&&/pre&&/div&&p&显然这样的代码不是特别理想,其中有较多可抽象的重复的逻辑,针对这样的需求场景,Picasso提供了hlayout布局函数,完美的解决了水平排布的问题:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&
hlayout([v1, v2, v3, v4],
{ top: 10, left: 10, divideSpace: 10 })
&/code&&/pre&&/div&&p&有心人可以发现,这和Android平台经典的LinearLayout如出一辙。对应hlayout函数的还有vlayout,这一对几乎完整实现Android LinearLayout语义的兄弟函数,实现逻辑不足300行,这里强调的重点其实不在于两个layout函数,而是Picasso布局DSL无限制的抽象表达能力。如果业务场景中需要类似于Flexbox或其他的概念模型,业务应用方都可以按需快速的做出实现。&/p&&p&在性能方面,Picasso锚点布局系统避免了“声明式到命令式”的计算过程,完全无需布局计算引擎的介入,达成了“需求表达即计算”的效果,具有理论上最佳性能表现。&/p&&p&由此可见,Picasso布局DSL,无论在性能潜力和表达能力方面都优于以上布局系统。Picasso布局DSL的设计是Picasso得以构建高性能四端动态化框架的基石。&/p&&p&同时得益于Picasso布局DSL的表达能力和扩展能力,Picasso在自动化生成布局代码方面也具有得天独厚的优势,生成的代码更具有可维护性和扩展性。伴随着Picasso的普及,当前前端研发过程中“视觉还原”的过程会成为历史,前端开发者的经历也会从“复制”视觉稿的重复劳动中解脱出来。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-f4e1b7ddf179f34b4acfbdd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&800& data-rawheight=&500& data-thumbnail=&https://pic3.zhimg.com/v2-f4e1b7ddf179f34b4acfbdd_b.jpg& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic3.zhimg.com/v2-f4e1b7ddf179f34b4acfbdd_r.jpg&&&/figure&&p&&b&Picasso高性能渲染&/b&&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-696f62f3453286cecec9ad5b16e80431_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&462& data-rawheight=&380& class=&origin_image zh-lightbox-thumb& width=&462& data-original=&https://pic4.zhimg.com/v2-696f62f3453286cecec9ad5b16e80431_r.jpg&&&/figure&&p&&br&&/p&&p&业界对于动态化方案的期待一直是“接近原生性能”,但是Picasso却做到了等同于原生的渲染效率,在复杂业务场景可以达成超越原生技术基本实践的效果。就目前Picasso在美团移动团队实践来看,同一个页面使用Picasso技术实现会获得更好的性能表现。&br&&/p&&p&Picasso实现高性能的基础是宿主端高效的原生渲染,但实现“青出于蓝而胜于蓝”的效果却有些反直觉,在这背后是有理论上的必然性的:&/p&&ul&&li&Picasso的锚点布局让 &b&布局表达和布局计算同时发生&/b&。避免了冗余反复的布局计算过程。&/li&&li&Picasso的布局理念使 &b&视图层级扁平&/b&。所有的视图都各自独立,没有为了布局逻辑表达所产生的冗余层级。&/li&&li&Picasso设计支持了 &b&预计算的过程&/b&。原本需要在主线程进行计算的部分过程可以在后台线程进行。&/li&&/ul&&p&在常规的原生业务编码中,很难将这些优化做到最好,因为对比每个小点所带来的性能提升而言,应用逻辑复杂度的提升是不能接受的。而Picasso渲染引擎,将传统原生业务逻辑开发所能做的性能优化做到了“统一复用”,实现了一次优化,全线受益的目标。&/p&&p&&b&Picasso在美团内部的应用&/b&&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-a3fddacfff9_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&552& data-rawheight=&326& class=&origin_image zh-lightbox-thumb& width=&552& data-original=&https://pic4.zhimg.com/v2-a3fddacfff9_r.jpg&&&/figure&&p&Picasso跨平台高性能动态化框架在集团内部发布后,得到了广泛关注,集团内部对于客户端动态化的方向也十分认可,积极的在急需敏捷发布能力的业务场景展开Picasso应用实践;经过大概两年多的内部迭代使用,Picasso的可靠性、性能、业务适应能力受到的集团内部的肯定,Picasso动态化技术得到了广泛的应用。&/p&&p&通过Picasso的桥接能力,基于Picasso的上层应用程序仍然可以利用集团内部移动技术团队积累的高质量基础建设,同时已经形成初步的公司内部大生态,多个部门已经向Picasso生态贡献了动画能力、动态模块能力、复用Web容器桥接基建能力、大量业务组件和通用组件。&/p&&p&Picasso团队除了持续维护Picasso SDK,Picasso持续集成系统、包括基于VSCode的断点调试,Liveload等核心开发工具链,还为集团提供了统一的分发系统,为集团内部大前端团队开展Picasso动态化实践奠定了坚实的基础。&/p&&p&到发稿时,集团内部Picasso应用领先的BG已经实现Picasso动态化技术覆盖80%以上的业务开发,相信经过更长时间的孵化,Picasso会成为美团移动开发技术的“神兵利器”,助力公司技术团队实现高速发展。&/p&&p&列举Picasso在美团的部分应用案例:&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-79d610e2caefba07b4f84b7_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&1125& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic2.zhimg.com/v2-79d610e2caefba07b4f84b7_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-337af881faaeba0d1feecf5_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&594& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic4.zhimg.com/v2-337af881faaeba0d1feecf5_r.jpg&&&/figure&&p&&br&&/p&&p&&b&Picasso开启大前端未来&/b&&/p&&p&Picasso在实践客户端动态化的方向取得了成功,解决了传统客户端“静态”研发模式导致的种种痛点。总结下来:&/p&&ol&&li&如果想要 &b&敏捷发布&/b&,使用Picasso。&/li&&li&如果想要 &b&高交付质量&/b&,使用Picasso。&/li&&li&如果想要 &b&优秀用户体验&/b&,使用Picasso。&/li&&li&如果想要 &b&高性能表现&/b&,使用Picasso。&/li&&li&如果想要 &b&自动化生成布局代码&/b&,使用Picasso。&/li&&li&如果想要 &b&高效生产力&/b&,使用Picasso。&/li&&/ol&&p&至此Picasso并没有停止持续创新的脚步,目前Picasso在Web端和微信小程序端的适配工作已经有了突破性进展,正如Picasso在移动端取得的成就一样,Picasso会在完成四端统一(Android、iOS、Web、小程序)的同时,构建出更快、更强的大前端实践。&/p&&p&业界对大前端融合的未来有很多想象和憧憬,Picasso动态化实践已经开启大前端未来的一种新的可能。&b&Picasso暂时还未开源,如对Picasso有兴趣,欢迎加入大众点评的大家庭。&/b&&/p&&p&&b&作者简介&/b&&/p&&p&晓燕,Picasso核心SDK团队负责人,八年移动应用开发经验,2012年加入大众点评。Picasso 核心SDK团队致力于探索更好的客户端动态化实践方案,贡献和维护高性能高可靠性的Picasso SDK,同时推进Picasso的应用和大生态的引导和建设。&/p&&p&大为 ,Picasso项目负责人,点评平台移动技术负责人,点评平台在持续交付点评平台性产品的同时,持续输出支撑集团移动技术的框架和方案;点评平台移动技术团队同时也是广义的Picasso团队,全面参与建设了Picasso工具链,Picasso持续集成系统,Picasso分发系统,Picasso核心UI组件,点评平台会持续助力集团移动端业务的动态化演进。&/p&&p&&br&&/p&&p&&b&也许你还想看&/b&&/p&&p&&u&&a href=&https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMjM5NjQ5MTI5OA%3D%3D%26mid%3D%26idx%3D2%26sn%3Dcd9a139a6d019f58f493%26chksm%3Dbd12ae468aaae2bc2b3f310f664ce46ee05ccc14996%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WWDC案例解读:大众点评相机直接扫描支付是怎么实现的&/a&&/u&&/p&&p&&u&&a href=&https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMjM5NjQ5MTI5OA%3D%3D%26mid%3D%26idx%3D1%26sn%3Dba8e91572efb90%26chksm%3Dbd12af948af4bca2cd3e210bc38e74b8e92eca5b11cdd3be6a950f7d7e69b5145f%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&大众点评账号业务高可用进阶之路&/a&&/u&&/p&&p&&u&&a href=&https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMjM5NjQ5MTI5OA%3D%3D%26mid%3D%26idx%3D2%26sn%3Df2c216c1ca8f42eb3a57%26chksm%3Dbd12ac358a04a339e5c075aa627ec2c3cea1fb458f5dc50b0f1d473%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&美团点评金融平台Web前端技术体系&/a&&/u&&br&&/p&&p&&a href=&https://link.zhihu.com/?target=http%3A//weixin.qq.com/r/9HVSSg3EOFBHrUkp9yDm& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&weixin.qq.com/r/9HVSSg3&/span&&span class=&invisible&&EOFBHrUkp9yDm&/span&&span class=&ellipsis&&&/span&&/a& (二维码自动识别)&/p&&p&&/p&
背景Picasso是大众点评移动研发团队自研的高性能跨平台动态化框架,经过两年多的孕育和发展,目前在美团多个事业群已经实现了大规模的应用。 Picasso源自我们对大前端实践的重新思考,以简洁高效的架构达成高性能的页面渲染目标。在实践中,甚至可以把Nativ…
&p&我可以负责人的告诉题主,据我所知至少在杭的网易、阿里前端跟后端是一个批发价。(我说的是业务层的,你非得说开发Web 3D引擎的前端比一个普通的Java价格贵,或者玩hadoop的数据研发比一个普通前端高这就是属于杠精了)。&/p&&p&&br&&/p&&blockquote&我们指的前后端一定是web开发的前后端,属于web业务开发,不然写中间件、大数据的后端,写web 3D引擎、前端框架设计的前端都属于脱离传统web开发的范畴了&/blockquote&&p&&br&&/p&&p&我指的是同水平的情况下,因为个体的差异十分大,但是普遍一个P6/7的前端跟一个P6/p7的后端是一个价格。&/p&&p&&br&&/p&&p&题主因为还是在上学,我再多说几句,很多大学老师其实离软件行业很远了,我们不排除一些大牛老师跟企业保持着密切的合作,比如我老师浙大翁恺,我之前在网易的时候还经常与我们有合作(现在不清楚了),网易云课堂上有大量他的课。&/p&&p&&br&&/p&&p&所以老师对行业的一些看法并非可以全信,来知乎问问是好的,但是知乎上每个人的观点也不一样,现在就有人说后端价格更高这个观点,我再给你讲得详细一点。&/p&&p&&br&&/p&&p&&b&1.一定程度上上持后端薪资更高的观点也是对的,&/b&为什么?如果你算一下阿里前端的平均薪资和后端平均薪资,一定是后端高,因为前端的地位提高就这几年的事情,现在你去阿里p7前端跟后端(阿里后端就是java)是一个价格,可是之前一定是后端高,加之后端在阿里创建之初就有了,很多后端出身的人早进入管理层了,但是他们依然是挂着p9/p10的头衔的后端,前端不过是10年前后才发力的,p10以上的前端其实就那么一两个。&/p&&p&&br&&/p&&blockquote&严格来讲到了p10这个级别已经没什么前后端这一说了,只不过是前端出身或者后端出身而已,如果是一路走技术路线上来的,前后端啥的都是通吃的,如果走的管理,其实已经不算技术了,那就是纯粹的管理。&/blockquote&&p&所以你现在根本不用担心这些问题,现在批发价是一样的,因为不管是平均数怎么样,到自己手里的才是王道。&/p&&p&&br&&/p&&p&&b&2.个体差异很大,即使同一个级别拿的也有多有少&/b&,我其实在同级别的工程师里是属于最高薪那个级别的,虽然讨论薪资是高压线,但是每个员工都或多或少知道自己的情况,当时去阿里的时候我开的价格很高,一个原因是我当时并不想离开网易如果不到一定价格我是不会走的,还有一个原因是想探一下自己的价值到底有多高。&/p&&p&这就牵扯到一个程序员生存策略了,每年一定要拿出两个月出去面试(不管你要不要走),需要不断评估自己的价格和发现自己身上的缺点及时弥补,很多程序员不知道自己值多少钱,要么不敢要工资、要么狮子大开口,想知道自己值多少,去市场上试水是做好的办法,要记住一点,&b&你的价格是市场决定的,而不是你的能力&/b&,你的能力在稳定市场情况下可以跟价格成正比,但是市场永远不是稳定的,看看当年的安卓/ios多风光,再看看现在,人还是那批人,市场却要凉了。&/p&&p&&br&&/p&&p&&b&3.不管是前端还是后端只是个敲门砖&/b&,很多年轻(其实我也挺年轻的)的小伙伴们都有一些执念,比如打算写一辈子Java成为Java大牛,走向人生巅峰,其实想法是好的,但是不可取。&/p&&p&我们从技术角度来说,因为写一辈子Java是当不了Java大牛的,你依然需要学习JVM系的Scala、Kotlin,更底层的c/c++,还有Go、Erlang这些拥有Java不同哲学的语言,最后发现你Java只是你的敲门砖,真正让你成为Java大牛的是你懂的不同语言的哲学,懂得不同场景下发挥出Java的优势,规避Java的劣势,深知Java的优缺点,而不是抱着Java是最好的语言,写一辈子Java。&/p&&p&&br&&/p&&p&我们从职业生涯的角度来说,我在前文中用描述高P的工程师的词汇不知道主要到了没,『xx出身』,对于高P而言没有前后端,前后端知识敲门砖,因为我们今天讨论的Web业务层面的开发,说实话都是处于计算机难度底端的玩意,之于一些答主说的鄙视链其实就是中国队鄙视泰国队,菜鸡互啄。&/p&&p&&br&&/p&&p&在Web这条线上想走到高P,基本上都是走业务架构这条路,这考验的就是大局观了,你只会一个前端或者一个Java根本不够格,纯粹研究技术上P10的基本上属于蜀道难了,说的清楚点,对于传统的Web开发工程师(前后端)不通过管理走高P基本上只有往架构方向走,这个时候靠的是你全面的能力和良好的大局观,你当初的那些前端技术、后端技术就是个敲门砖。&/p&&p&p10以上还能纯玩技术的我指出几个方向,&b&算法相关岗位(深度学习、计算机视觉等)、数据相关岗位、图形学相关岗位(比如网易开发游戏引擎的大牛等)、大规模系统的底层相关(阿里云)、安全相关。&/b&&/p&&p&你普通的web开发,前端写出花、后端写得上天了,也靠纯技术走不到高P,时刻认知到自己处于计算机难度的最底层就行了,因为前后端技术本身没什么高深的,基本上都是工业界实践的结果,你会看到xx公司从xx实验室、xx高校挖了个深度学习专家、数据科学家,你见过挖了个某教授来做web开发了?&/p&&p&&br&&/p&&p&总结:&/p&&ol&&li&前后端目前在大厂至少是一个批发价。&/li&&li&你作为一个个体能拿多少取决于市场,也取决你的个人能力和谈判能力,更平均薪资无关。&/li&&li&不管是前端还是后端,只是你之后发展的敲门砖,传统web开发没有难度可言,想走高P懂前后端是最最起码的要求。&/li&&/ol&&p&&br&&/p&&p&&br&&/p&&p&最后题主问到如何规划自己的事业,我上文说的很清楚了,前端只是你的敲门砖,我指几个靠前端敲门后的大方向:&/p&&ol&&li&web开发: 前端、后端是web开发的两个端,其实同城web开发,在很多国外公司没前后端这个说法,都叫做『软件工程师』或者web developer,其实要转换一个思想,前后端并不是对立的,而是纯粹的一家人,只是被国内外的一些市场强行分成了前后端,归根到底是需要前后端都懂得,所以在你保持前端高水平的情况下,精进一些后端技术是必要的,但是要分清主次,前端为主。&/li&&li&数据方向:以后数据就是互联网时代的石油嘛,这个方向也不错,在前端这边就是可视化相关的技术,在阿里这边有大量的数据可视化实践,因为阿里号称自己是数据公司(中石油?),想做这一行建议搜知乎相关如何入门,提前说下,并不是用echarts渲染个图表就叫可视化了,这行水非常深,在高校有很多这个方向的研究人员,所以搜&b&浙大陈为&/b&了解下,反正逼格比web开发高是一定的,以后再精进也还是离不开大数据相关的东西什么hive、hadoop之类的,可视化是整个数据链路最外层,最后走高P还是需要理解整个链路层的。&/li&&/ol&&p&说的再清楚点,web开发分web前端和web后端,是以web服务的角度来看待的,数据研发这个是在web开发的基础上用数据附能,懂可视化的一定是有前端能力的,懂hadoop的一定java玩的溜,属于web开发的拓展方向。&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-02a8cfcd7d4ee8d58c9b9ec41b7907a9_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1065& data-rawheight=&667& class=&origin_image zh-lightbox-thumb& width=&1065& data-original=&https://pic4.zhimg.com/50/v2-02a8cfcd7d4ee8d58c9b9ec41b7907a9_r.jpg&&&/figure&&p&3. 大前端方向: 上文提过了,移动端的ios/安卓早就式微了,但是并不代表死了,只是所有公司都意识到没必要上原生开发了,知道养安卓/ios/web三个团队多浪费钱嘛,就那么点的用户量和难度,创业期直接all in小程序就行了,等做大了再上安卓/ios,而且也不用全上,30%的native+70%hybrid用户根本看不出差异,而且成本和效率不知道强了多少,一些大厂比如阿里在大量实践rn和weex,由于公司内部安卓/ios式微,一定程度上前端把ios和安卓收编了,统称大前端(还有node),比较出名的是饿了么和美团,这种收编一定程度上也是政治的需要,像美团这种企业一定是重后端的,距刘平川说收编完安卓/ios后加上node团队,大前端人数与后端持平,可以想象大前端的leader的话语权了,学一点ios/安卓没坏处。&/p&&p&&br&&/p&&p&4. 图形学方向: 图形学的集大成者无疑是游戏行业,当然阿里也有自己的游戏业务,前端自然是与图形学有千丝万缕的联系,除了我们上面提到了可视化,还有相关3d引擎的开发工作,比如玉伯的团队正在内部孵化antG(未开源),淘宝那边已经有前端3d引擎的开源项目,支付宝内部的蚂蚁森林就是前端开发的,用的正是canvas/webgl相关的技术,做这一行要求也非常高了,图形学相关的算法,3d引擎的开发这都需要图形学相关知识,要严格来讲很难算传统意义上的前端了,更像是图形学在浏览器端的应用,之后发展肯定是需要借鉴传统图形学的方案,所以c/c++少不了,同时3d/2d在浏览器端吃性能,需要webassembly加持,native语言是更少不了了。&/p&&p&&br&&/p&&p&总之要么在广度上下功夫,要么在深度上下功夫,其目的就是在技术上高出其他人一个维度。&/p&&p&&br&&/p&&p&当然还有从业务方面考虑的,以后再说吧,这方面就是要知道你的技术是为商业服务的,企业不是高校,骗骗经费就能活得潇洒,产生利润,并让你的leader知道你的价值才是王道。&/p&
我可以负责人的告诉题主,据我所知至少在杭的网易、阿里前端跟后端是一个批发价。(我说的是业务层的,你非得说开发Web 3D引擎的前端比一个普通的Java价格贵,或者玩hadoop的数据研发比一个普通前端高这就是属于杠精了)。 我们指的前后端一定是web开发的前后端,…
写这篇文章,是因为我发现最近我的回答下面有很多『前排膜拜尤大』这样的评论。你要说被人膜拜爽不爽?说不爽那是骗人的。但这样的评论一多,我心里其实更多的是惶恐。&p&做脑力工作的人,往往钻研得越深,越发现自己的渺小和无知。我虽然在前端这个领域做了一些微小的工作,但每次看看 Linus Torvalds 或者是 Fabrice Bellard 这样的『真·大神』的事迹,也会觉得高山仰止。除了少数站在人类智能巅峰的怪物,大部分人其实穷其一生也躲不过在这些少数人的光芒下黯然失色的命运...&/p&&p&扯远了。其实我想说的是,作为程序员,对于另一个程序员的『崇拜』并不是一种很健康的心态。每次有人问我,『你有你崇拜的其他程序员吗?』,我都会有些迟疑,因为事实上我并不对任何程序员抱有『崇拜』的态度,绝大部分时候是『敬佩』。过度的『崇拜』另一个人,往往让人妄自菲薄,觉得自己好像永远也赶不上对方,甚至放弃了赶上对方的努力。但事实上,这世上碾压众生的『怪物』也并没有那么多,大部分有点名气的程序员,可能是因为种种机遇才得以成名,单论技术实力,其实也都在凡人努力可及的范围之内。相比之下,『敬佩』一个人,则心态上更多地会去思考这个人身上有什么东西值得我学习,我如何才能拉近自己和对方之间的距离。&/p&&p&所以,我希望 Vue 的用户以后尽量不要在我的回答下面留『膜拜』之类的回复,一来如上面所说,二来这类回复也没有什么营养,虽然知乎世风日下,但还是尽量做到言之有物比较好。&/p&&p&---&/p&&p&题外话:也有一类程序员走的是反面极端,谁也看不上,开口就是 XX 设计蠢到家,只有我最屌。这类程序员一般技术实力也是有那么一点的,但通常也伴随着认知失调 + 情商负数。一个情商正常的程序员应该懂得在该谦虚的时候谦虚,该装逼的时候装逼...&/p&
写这篇文章,是因为我发现最近我的回答下面有很多『前排膜拜尤大』这样的评论。你要说被人膜拜爽不爽?说不爽那是骗人的。但这样的评论一多,我心里其实更多的是惶恐。做脑力工作的人,往往钻研得越深,越发现自己的渺小和无知。我虽然在前端这个领域做了一…
&p&&b&我是谁?我在哪里?我为什么要用 Redux?&/b&&/p&&p&8102 年,Redux 似乎突然遭到了口诛笔伐,连 Dan 都不承认自己创造了 Redux,转身为 React 设计了The New Context API 解决组件树中数据共享难的问题,配合在高阶组件(HOC)中更新 state 的用法,完全取代了 Redux 数据共享与数据更新两大功能。同时 The New Context API
采用的 Provider/Consumer 模式为我们提供了 Store 分形的能力 -- &a href=&//link.zhihu.com/?target=https%3A//staltz.com/unidirectional-user-interface-architectures.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TL;DR;「单向用户交互架构」&/a&,我们可以放心地为领域组件注入数据依赖,如果你开发 React 应用的主要痛点就是这三个,不用多说,新项目直接抛弃 Redux。&/p&&figure&&img src=&https://pic2.zhimg.com/50/v2-22bbec319ee56be464cd24c_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&631& data-rawheight=&167& class=&origin_image zh-lightbox-thumb& width=&631& data-original=&https://pic2.zhimg.com/50/v2-22bbec319ee56be464cd24c_r.jpg&&&/figure&&p&然而,凡事有个但是。Redux 并没有寿终正寝,它还是有着它独特的应用场景为真正需要它的人提供服务。这些个场景,恰好是由他的「缺点」带来的。&/p&&p&先说 Redux/Redux-react 的缺点,再说它的「缺点」,再说它的应用场景。&/p&&p&Redux/Redux-react 最为人诟病的地方是它复杂的模板代码、啰嗦的 API、强制 immutable 的更新方式及注入组件的方式(connect),以至于出现了各种简化它的周边: &a href=&//link.zhihu.com/?target=https%3A//github.com/xgrommx/awesome-redux& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&awesome-redux, 见 tool 部分&/a& 。&/p&&p&同样是外置的、响应式视图驱动的、概念相近的、状态管理兄弟 Vuex,这些问题就解决得好多了:&/p&&ol&&li&Vuex 的响应驱动复用 Vue 的响应机制;&/li&&li&细粒度地更新视图(得益于第 1 点 );&/li&&li&集中地管理了 state, mutation,action、getter;&/li&&li&带有分形结构 -- module;&/li&&li&组件在 vm::computed 中取值,同时受益于免费的计算缓存(memorization);&/li&&/ol&&p&与之相对:&/p&&ol&&li&Redux 要内置发布订阅器;&/li&&li&粗暴地、级联式刷新视图(这里不尽然,React.PureComponent 和 connect HOC 可以提供优化,这个行为 React 使然);&/li&&li&分散地定义 state, reducer,action / actionCreator,selector,再用各种 helpers 组合在一起;&/li&&li&原生 Redux-react 没有分形结构,中心化 store;&/li&&li&没有计算缓存;&/li&&/ol&&p&改良 Redux 的方案很多,他们解决问题的侧重点各不相同,也缺乏一个大而全的终极方案可以把 redux 的当做基础元件隐而用之,具体的方案不在赘述的范围,但要追究一下产生这些问题的原因。&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-12c5b31bab88e0b54d7c5cca_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&632& data-rawheight=&303& class=&origin_image zh-lightbox-thumb& width=&632& data-original=&https://pic1.zhimg.com/50/v2-12c5b31bab88e0b54d7c5cca_r.jpg&&&/figure&&p&&b&最显而易见的原因应当是 React 官方长期无为而治&/b&,状态管理弱主张,促进了好的想法如雨后春笋,但从不钦定标准做法,也不收编第三方库,哪怕提出 Flux 也只是拋砖引玉的做法,不可避免地导致 Redux 有了野蛮生长的空间,它一坐大,它的周边就如野火起了燎原之势一般,还与 Redux 相互促进。直到 React 招安了 &a href=&//link.zhihu.com/?target=https%3A//twitter.com/dan_abramov& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Dan Abramov&/a&,才终于走向引导群众践行「最佳」实践,收束纷繁杂乱的 React 写法之路。&/p&&p&另一个不能忽视的原因是:&b&受 JavaScript 这门语言的能力所限&/b&,Redux 借鉴了 Elm 的设计思想,但它无法提供 Elm 一般优雅的开发体验,对比一下 Redux vs Elm:&/p&&p&&b&声明 action:&/b&&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span class=&kr&&const&/span& &span class=&nx&&Inc&/span& &span class=&o&&=&/span& &span class=&s1&&'Inc'&/span&
&span class=&kr&&const&/span& &span class=&nx&&Dec&/span& &span class=&o&&=&/span& &span class=&s1&&'Dec'&/span&
&span class=&kr&&const&/span& &span class=&nx&&createIncAction&/span& &span class=&o&&=&/span& &span class=&p&&(&/span&&span class=&nx&&count&/span&&span class=&p&&)&/span&
&span class=&o&&=&&/span& &span class=&p&&({&/span& &span class=&nx&&type&/span&&span class=&o&&:&/span& &span class=&nx&&Inc&/span&&span class=&p&&,&/span& &span class=&nx&&payload&/span&&span class=&o&&:&/span& &span class=&nx&&count&/span& &span class=&p&&})&/span&
&span class=&kr&&const&/span& &span class=&nx&&createDecAction&/span& &span class=&o&&=&/span& &span class=&p&&(&/span&&span class=&nx&&count&/span&&span class=&p&&)&/span&
&span class=&o&&=&&/span& &span class=&p&&({&/span& &span class=&nx&&type&/span&&span class=&o&&:&/span& &span class=&nx&&Dec&/span&&span class=&p&&,&/span& &span class=&nx&&payload&/span&&span class=&o&&:&/span& &span class=&nx&&count&/span& &span class=&p&&})&/span&
&/code&&/pre&&/div&&p&vs&/p&&div class=&highlight&&&pre&&code class=&language-elm&&type Msg = Inc Int | Dec Int
&/code&&/pre&&/div&&p&&b&更新 state:&/b&&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span class=&kr&&const&/span& &span class=&nx&&reducer&/span& &span class=&o&&=&/span& &span class=&p&&(&/span&&span class=&nx&&state&/span& &span class=&o&&=&/span& &span class=&nx&&init&/span&&span class=&p&&,&/span& &span class=&nx&&action&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&k&&switch&/span& &span class=&p&&(&/span&&span class=&nx&&action&/span&&span class=&p&&.&/span&&span class=&nx&&type&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&k&&case&/span& &span class=&nx&&Inc&/span&&span class=&o&&:&/span&
&span class=&k&&return&/span& &span class=&nx&&state&/span& &span class=&o&&+&/span& &span class=&nx&&action&/span&&span class=&p&&.&/span&&span class=&nx&&payload&/span&
&span class=&k&&case&/span& &span class=&nx&&Dec&/span&&span class=&o&&:&/span&
&span class=&k&&return&/span& &span class=&nx&&state&/span& &span class=&o&&-&/span& &span class=&nx&&action&/span&&span class=&p&&.&/span&&span class=&nx&&payload&/span&
&span class=&k&&default&/span&&span class=&o&&:&/span&
&span class=&k&&return&/span& &span class=&nx&&state&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&vs&/p&&div class=&highlight&&&pre&&code class=&language-elm&&update msg Model =
case msg of
Inc count -&
Model + count
Dec count -&
Model - count
&/code&&/pre&&/div&&p&&b&发出 action:&/b&&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span class=&o&&&&/span&&span class=&nx&&div&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&nx&&button&/span& &span class=&nx&&onClick&/span&&span class=&o&&=&/span&&span class=&p&&{()&/span& &span class=&o&&=&&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&props&/span&&span class=&p&&.&/span&&span class=&nx&&dispatch&/span&&span class=&p&&(&/span&&span class=&nx&&createIncAction&/span&&span class=&p&&(&/span&&span class=&mi&&42&/span&&span class=&p&&))}&/span&&span class=&o&&&+&&/span&&span class=&err&&/button&&/span&
&span class=&o&&&&/span&&span class=&nx&&button&/span& &span class=&nx&&onClick&/span&&span class=&o&&=&/span&&span class=&p&&{()&/span& &span class=&o&&=&&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&props&/span&&span class=&p&&.&/span&&span class=&nx&&dispatch&/span&&span class=&p&&(&/span&&span class=&nx&&createDecAction&/span&&span class=&p&&(&/span&&span class=&mi&&42&/span&&span class=&p&&))}&/span&&span class=&o&&&-&&/span&&span class=&err&&/button&&/span&
&span class=&o&&&&/span&&span class=&err&&/div&&/span&
&/code&&/pre&&/div&&p&vs&/p&&div class=&highlight&&&pre&&code class=&language-text&&div []
[button [ onClick &| Inc 5 ] [ text &+& ]
,button [ onClick &| Dec 2 ] [ text &-& ]
&/code&&/pre&&/div&&p&发现没有,Elm 只需要定义一类似于 class 构造器(constructor) 的东西(type),就具备了 Redux 要用有 type 属性的对象才能构造出的通信协议(action)的能力。Redux 为了方便负载不同的值还创造了 actionCreator(createIncAction/createDecAction) 这些玩意,同时这个 action 的定义直接暴露给了开发者,那人们又有了完全不用 type 表示这个通信协议的自由,这种「自由」最终增加了开发者的心智负担。再比起 Elm 强大的模式匹配功能带给开发者在更新 model (redux 中的 state) 时爽快的体验,JavaScript 的 switch 语句显示底气不足太多。&/p&&p&&b&PS:&/b& 敏锐的同学应该可以发现,在 JavaScript 的世界里并非只有对象字面量可以当这个通信协议,class 也能胜任,它自持了 type 信息,instanceof 就能鉴定消息的 type,比如 &a href=&//link.zhihu.com/?target=https%3A//www.npmjs.com/package/ractor& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Ractor&/a& 就在做这件事情。未来的模式匹配 (&a href=&//link.zhihu.com/?target=https%3A//github.com/tc39/proposal-pattern-matching& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&tc39/proposal-pattern-matching&/a&) 也会减轻一些书写 reducer 的负担(仍然很丑)。&/p&&p&到此,我觉得 Redux 已经批判完了,一部分结论也有了:&b&尽可能地用 The New Context API&/b&,那 Redux 是否有它的适用性场景呢?这里一定要推荐一下这个视频,看看 Dan 本人是如何介绍 Redux 的:&/p&&a href=&//link.zhihu.com/?target=https%3A//www.youtube.com/watch%3Fv%3DuvAXVMwHJXU& data-draft-node=&block& data-draft-type=&link-card& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Dan Abramov - The Redux Journey at react-europe 2016&/a&&ol&&li&Reducer 是纯函数,易组合、易测试;&/li&&li&State 和 action 可序列化,易表达,易分发,易存储;&/li&&li&State + Reducer 是状态机模型,易应用(apply)、易撤销、易预测、易重播;&/li&&li&有中间件机制,action 可以是一个对象字面量,也可以是一个 promise,一个 observable,一个 function,用鸭子辨形区别分出 action 的类型,它们负责标准的 action 派发&/li&&/ol&&p&结合这些点,我们能想像哪些有意思的应用场景呢?&/p&&ol&&li&Reducer 是纯的,没有副作用,由 action 驱动,那 action 是哪来的呢?它由人的操作触发,操作源自人类的意图(intent),那我们是不是有可能写一个响应人类意图的机器人来为我们服务呢?只要启动指令(即意图的表达,第一个 action),就会有一段定义好的程序按流程分发归属它们的 actions --& reducer 产生新的 state --& 驱动视图变化。同样的,我们也可以同时发出多个指令,多个操作流并行的过程中互相触发各自操作流的分支条件。看上去会很复杂的这些个程序,在 redux 的模式下变简单了,操作流的分支虽然太多,不能枚举,但每个操作流却只需要功能自治,响应式地处理外部信号即可。&b&因此为了用上多年沉淀下来专门做这些事的 Redux 周边(Redux-Observable/Redux-Saga...),你还是需要 Redux&/b&;&/li&&li&state 和标准 action 都是能序列化成 JSON 的,当你同时有 state 和 action,只要用 reducer 把所有的 action 按发生的顺序执行一遍,&b&我们就突然有了时间漫游的能力,还可以还原现场&/b&。这好像酷弊了。&b&假设我们的应用基于贫血模型构建&/b&,数据由 Redux 驱动,此处就可以大开脑洞了,看过 war3 的录像吗?它就是这个原理。通过存储 state 和 action,我们可以把用户的一系列操作和浏览器信息收集起来:&/li&&ol&&li&当接到用户反馈时,工程师可以重播用户的操作,找出问题发生的路径,比起摸索茫茫多无用的错误栈有效得多;&/li&&li&当需要协作办公时,同步一下 state,两人访问的页面就保持一致了,一方发送一个 action 给对方的 reducer,立刻实现了远程操作;&/li&&li&无侵入式埋点,你的点击、输入、提交事件由 action 记录,他们就是天然的日志系统,仔细设计一番也许一年的 KPI 就来自此;&/li&&li&乐观更新策略,请求在结果返回前做出请求成功的响应操作,当请求失败时回退 state 版本并通知用户请求失败;&/li&&li&无网络下暂存网络请求相关的 action,当有网络时自动恢复 action 的派发,试试无网的时候为你的朋友圈好友点赞?&/li&&li&邪恶的目的:监控用户,收集隐私,恶意操作;&/li&&/ol&&li&数据可以被持久化,服务端能渲染出一个「中间」状态的网页发送给用户,state 也能以字符串的形式存于 localstorage 中让用户下次访问时恢复会话;&/li&&li&如果很注重开发体验的话,Redux 能为你提供测试、撤销、保存 state 的功能:&/li&&ol&&li&通常你合适的组件库是完整测试过的,测试业务你只需要测试你每一个 action 驱动的 state 符合预期即可;&/li&&li&开发中每次更新组件,比起刷新页面,让 Redux 还原一下更新前的 state,又或是当系统报错,修复完你的代码后,让 Redux 应用一个最近「正常」的 state,马上就能还原现场 -- &a href=&//link.zhihu.com/?target=https%3A//github.com/gaearon/react-hot-loader& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&React Hot Loader&/a&;&/li&&li&观测 action 的顺序,更加方便确认你的工作流正确,而不仅限于确认「当前」的页面状态是正确的 -- &a href=&//link.zhihu.com/?target=https%3A//chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd%3Fhl%3Den& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Redux DevTools&/a&;&/li&&/ol&&/ol&&a href=&//link.zhihu.com/?target=http%3A//gaearon.github.io/the-redux-journey/& data-draft-node=&block& data-draft-type=&link-card& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The Redux Journey&/a&&p&看看这些特性有没有正好满足一些同学的业务(KPI)需求?有的己有轮子,有的还是设想,因时制宜的道理,已不用多说了吧?&/p&
我是谁?我在哪里?我为什么要用 Redux?8102 年,Redux 似乎突然遭到了口诛笔伐,连 Dan 都不承认自己创造了 Redux,转身为 React 设计了The New Context API 解决组件树中数据共享难的问题,配合在高阶组件(HOC)中更新 state 的用法,完全取代了 Redux 数…
&figure&&img src=&https://pic3.zhimg.com/v2-4f0884614_b.jpg& data-rawwidth=&1080& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic3.zhimg.com/v2-4f088461

我要回帖

更多关于 苹果X什么时候发行 的文章

 

随机推荐