Es hora de que hablemos de JavaScript orientado a objetos。
在代码示例中考虑文化偏见
抱歉拼写错误,但要怪程序
微服务-大小无关紧要!
在进行Angular E2E测试的道路上-量角器和黄瓜
NgColombia将被推迟到2020年✋
发现在Azure上托管节点应用程序的详细信息
发现在Azure上托管节点应用程序的详细信息

我最近正在开发Node JS应用程序,我认为Azure是托管我的应用程序的正确位置,因为它使将其部署到生产环境变得非常容易。 但是,在部署应用程序后不久,我开始对Azure为使一切“正常运行”所做的一些神奇工作产生疑问。 这篇文章总结了我尝试揭示在Azure上托管Node应用程序所涉及的一些魔术的旅程。 我首先使用“ Node JS Empty Web App”模板在Azure上创建Node JS应用程序。 您还可以使用Azure CLI生成Azure App服务,如此处所示。 自然,下一步就是将自己的Node JS代码集成到新创建的项目中。 我首先下载了由于创建Azure App Service而生成的代码。 我使用Kudo下载了如下所示的代码。 在VS Code中打开下载的项目将显示几个文件,这些文件暗示了托管Node JS应用程序的Azure App Service的内部工作原理。 首先,请注意,在使用IIS托管应用程序时,需要一个web.config文件。 更重要的是,如果您仔细看,您会发现在 部分中有一个名为iisnode的模块。 经过进一步调查,结果发现iisnode是一个本机IIS模块,它允许在IIS中托管node.js应用程序。 iisnode具有多种优势,从在多核服务器上进行扩展的能力到自动更​​新一直都有。 issnode的优点的完整列表可以在这里找到。 我注意到的另一个有趣的文件是iisnode.yml,用于配置iisnode。 isnode将根据每个用户请求读取iisnode.yml文件。 因此,例如,如果需要在服务器端快速调试某些问题,则可以更改任何一个值,下一个请求将应用它。 打开文件后,我注意到nodeProcessCommandLine选项设置为node的4.2.4版本。 事实证明,节点版本按以下顺序确定: 如果内部有iisnode.yml和nodeProcessCommandLine属性:它将运行节点的确切路径。 如果在package.json ,有一个"engines":{"node":version}规范,则Azure将使用指定的版本。 在Azure门户上的“应用程序设置”中,将WEBSITE_NODE_DEFAULT_VERSION设置为环境变量之一 Azure的默认节点版本。 确切的版本会随时间变化。 注意:如果iisnode.yml存在,它将覆盖应用程序设置。 还要注意,如果您使用Kudo作为构建服务器,并且将代码链接到github存储库,则将触发选项2。 因此,如果您要从Azure DevOps进行部署而没有任务明确地执行此操作,请不要期望此选项会自动运行。 在那里,下次将您的Node应用程序部署为Azure App Service时,希望可以很好地理解所生成的不同文件。 在以后的文章中,我将研究使用Docker容器在开发Node应用程序时在开发计算机和Azure App Service上具有一致的环境。

反应❤预先
反应❤预先

喜欢React? 不要改变! 只需执行您的操作,然后将“别名” React as Preact变得更小,更快! 快点? 是的,我知道一些聪明的家伙说这个结果不准确,因为异步处理可能已经把结果弄乱了。 在那种情况下,我建议您改为用自己的眼睛看,因为用户会根据他们看到的内容进行判断,他们只是不在乎您使用哪个框架和/或是否异步 。 演示 :https://rabbots.github.io/todomvc-perf 来源 :https://github.com/rabbots/todomvc-perf 您可以在那里获得各种结果,当Preact在此处获得最佳结果时,我有足够的偏见。 而且测试的顺序会以某种方式影响结果,因此请尝试仅在此处检查2或3个样本,您将获得更准确的结果。 甚至更快 1个测试还不够,所以在这里我们进行另一个重涂测试 演示 :http://mathieuancelin.github.io/js-repaint-perfs/ 来源 :https://github.com/rabbots/js-repaint-perfs 较小的 预设 :139kb 反应 :245 kb 我让结果自行说明,请参见下面的信息来源🙂 来源 :https://github.com/katopz/redux-undo/tree/preact-compat/examples/todos-with-undo 专业提示:您可以使用https://github.com/robertknight/webpack-bundle-size-analyzer进行详细了解。 $ webpack --json | webpack-bundle-size-analyzer 核心js:198.71 KB(46.5%) html-entities:57.38 KB(13.4%) 主动:25.11 KB(5.88%) redux:22.02 KB(5.15%) babel-regenerator-runtime:20.95 KB(4.90%) react-redux:19.37 KB(4.53%) redux-undo:16 KB(3.74%) 原型:11.17 KB(2.62%) webpack-hot-middleware:9.56 KB(2.24%) […]

如何将Laravel与Google Firebase集成
如何将Laravel与Google Firebase集成

本文介绍了如何在Google Cloud Firebase中注册应用程序并将其集成到Laravel应用程序中 0.引言 Google Firebase是一项云服务,可通过身份验证,数据库,分析,数据和状态同步,消息传递(推送通知)等为您提供支持APP所需的所有工具。 在本文中,我将根据我们在项目开发期间在Square1中的经验,说明如何将Firebase集成到Laravel项目中。 1. FIREBASE应用程序注册🔥 转到https://console.firebase.google.com,然后单击“添加项目” 2.在您的项目上键入名称,然后单击“创建项目”。 3.项目准备就绪后,单击“继续” 4.然后,您应该转到https://console.cloud.google.com/iam-admin/serviceaccounts查看服务帐户。 在那里,您应该看到您的项目服务帐户。 现在,您可以单击三点菜单来创建密钥。 这将下载一个JSOn文件,其中包含执行以下几个步骤所需的所有凭据: 您将下载的JSON文件将包含以下数据: { “ type”:“ service_account”, “ project_id”:“ 1234”, “ private_key_id”:“ 1234”, “ private_key”:“ YOUR_PRIVATE_KEY”, “ client_email”:“ email@appspot.gserviceaccount.com”, “ client_id”:“ 1234”, “ auth_uri”:“ https://accounts.google.com/o/oauth2/auth”, “ token_uri”:“ https://oauth2.googleapis.com/token”, “ auth_provider_x509_cert_url”:“ https://www.googleapis.com/oauth2/v1/certs”, “ client_x509_cert_url”:“ https://www.googleapis.com/robot/v1/metadata/x509/YOUR_PROJECT_URL” } 2. FIREBASE SDK⚙ 您可以在此处找到Firebase PHP Sdk的源代码和github软件包: […]

组件组成世界中的React Context
组件组成世界中的React Context

如果您曾经在React的Context API正式成为稳定功能之前尝试过它,则您可能还记得阻止我们使用它的文档中的所有警告和红灯。 从React 16.3开始,Context API不再是实验性的—它是一项高级功能,旨在帮助开发人员避免“ Prop Drilling”问题。 本质上,Context使开发人员能够编写位于组件树深处并从更高层使用数据的React组件,而无需通过props通过中间组件传递数据: “上下文旨在共享可被视为React组件树的“全局”数据”( React Docs ) 该文档以及其他示例显示了Context的用法,它们描述了诸如语言环境或主题之类的通用数据存储在树的更高层上,并使用API​​通过更底层的组件进行消费的情况。 在本文中,我将尝试描述使用Context的另一种方法,以及在考虑组件组成时的好处。 让我们假设(您可以睁开眼睛,然后想象)我们有一个漂亮的应用程序,它比我们最初想象的要复杂得多。 我们希望使用户更容易浏览它,因此决定添加一个导航菜单。 我们应用程序中的某些页面具有子页面,这些子页面又可以具有自己的其他子页面。 产品要求是,当用户在我们的应用程序中查看特定页面时,菜单中的相应项目将突出显示。 如果突出显示的页面是子页面,这意味着它具有父页面,则父页面也会被突出显示。 作为React开发人员,我们喜欢考虑可重用组件。 如果您熟悉Atomic Design,也许您已经在将我们的菜单视为由可重复使用的菜单项组成的界面。 很快,如果您要实现此菜单,则可能会得到以下内容: 这非常简单-我们有菜单,其中包含可重复使用的MenuItem 。 第二个MenuItem使用children prop传递MenuItem ,该MenuItem将在菜单中呈现为子页面。 每个项目都有3个道具: label , isSelected和onClick 。 每当单击菜单项时,我们将简单地检查应突出显示哪些其他菜单项,并在组件状态下更新所选的项。 但是有关此代码的某些内容应该困扰我们。 感觉不像是“ Prop Drilling” —我们的菜单是组件的“平面”组成,并且我们没有在组件树的深处传递数据。 相反,我们正在重复自己。 我们正在重复将道具传递给MenuItem的方式。 如果我们改变了将MenuItem视为一个组件的方式,该怎么办? 从概念上讲,我们编写的大多数可重复使用的UI组件都可以在任何地方使用:您可以将该组件放置在代码中的某个位置,传递一些道具并观看它的呈现。 例如,一个简单的按钮可以在整个应用程序中满足不同的目的,并作为其自己的独立单元存在。 如果我们对菜单项之类的东西应用相同的想法,我们会注意到一些有趣的事情:作为组件的菜单项不能独立存在。 当然,您可以将其放置在任意位置,然后根据需要重复使用,但是没有菜单真的有意义吗? 让我们再来看一下上面的示例。 我们将利用React的Context的功能将MenuItem放在上下文中: 首先,我们使用React.createContext创建Provider和Consumer 。 以防万一,将默认值作为createContext的参数传递,如果在没有匹配提供程序的情况下呈现使用者,则将使用该默认值。 你可以在这里读更多关于它的内容。 接下来,我们创建一个MenuContextProvider ,它将包装我们的MenuItem并处理将项目标记为选中状态所需的逻辑。 在我们的示例中,它是selectedItems数组中的itemKey […]

2019年开发工具
2019年开发工具

对我来说,每年进行开发的工具大部分都保持不变,因为我像您一样有习惯。 我也不喜欢改变。 弄清楚新工具需要花费大量时间和精力,而我已经使用的工具非常适合我需要做的工作。 我要告诉你的第一件事是,我正在使用2016年的MacBook Pro(因此没有花哨的触摸栏)和配备一些出色应用程序的iPhone 6s。 由于我无法真正在手机上编码,因此我将主要关注Mac。 今天,我想写博客介绍我将在2019年使用的工具。至少我现在正在使用的工具,并计划继续使用。 开始了: 我使用iTerm已经超过3年了,离不开它。 我将其用于所有命令。 我正在使用ohmyzsh作为外壳,并使用了gianu主题。 对于其余的我没有其他定制。 使用iTerm2时,我有一些我真正喜欢的快捷方式。 我经常使用的命令是cmd + d以复制终端并具有并排终端。 接下来,在服务器上工作时,我也cmd + shift + i使用cmd + shift + i 。 我们有多个需要相同突击队的服务器。 该快捷方式使得可以在多个终端屏幕上同时执行相同的命令。 最后,我最喜欢的也是最常用的命令之一是cmd + r ,可清除任何输入的屏幕。 我在Keyhost上有一个捷径可以显示或隐藏终端。 为此,我映射了“§”键。 这是我从未使用过的标志,可在我的左手附近找到。 因此,每当我按下此按钮时,我的终端就会显示或隐藏起来。 很好,也很快。 显然,谷歌浏览器仍然是目前最好的浏览器之一。 但是Firefox确实取得了不错的回报,我仍然是Chrome迷。 另外,因为我使用自己的gmail帐户,并且在工作中使用gmail。 它在Chrome中的集成度更高。 Spotify是我的音乐流媒体应用程序。 我每天有50%的时间在玩。 无论是我在工作时或回家时。 即使我由于其他噪音而无法真正听到音乐,我也喜欢周围的音乐感觉。 我主要是玩Spotify自己的播放列表。 例如,发现播放列表,还有“全零”的播放列表。 我非常喜欢零位,因为我知道所有这些歌曲,并且喜欢一起唱歌。 我唱歌时周围的人不喜欢它! 哎呀,我也会在2019年演唱。 准备好🙃 告诉您我正在使用Bose quietcomfort 25消声耳机也很重要。 […]

Heroku Nginx配置
Heroku Nginx配置

设置 带有NGINX Web服务器的PHP应用程序在Heroku基础结构上运行。 添加应用程序级Nginx配置规则非常容易。 请遵循他们的文档“自定义PHP设置”。 如果要在Nginx`http`配置块(服务器级配置)中编辑某些内容,它将变得很复杂。 我想使用`ngx_http_limit_req_module`。 这需要在http块中添加“ limit_req_zone”。 因此,我无法将其添加到上述教程的配置文件中。 实际上,您需要在Heroku PHP builpack的conf / nginx / heroku.conf.php中一行一行。 第一种方法 为什么不克隆Heroku PHP buildpack官方仓库,编辑该文件。 然后更改应用程序buildpack并准备就绪! 这是非常容易和直接的更改。 显然,构建包倾向于改变。 使用自定义buildpack一个月后,每个应用程序构建过程均失败。 分叉的buildpack存储库与源同步,解决了该问题。 这次事故敲响了警钟,为此找到了更好的解决方案。 Heroku的支持给了一个。 我会说这是典型的“想要香蕉,让大猩猩在丛林中盛装香蕉”的例子。 第二种方法 Heroku支持建议在Procfile中使用-c选项来覆盖服务器级配置文件。 我在分叉存储库中先前编辑的同一文件。 所以: 在项目中创建了新文件, 复制了官方conf / nginx / heroku.conf.php文件中的内容, 添加了自定义修改(limit_req_zone)规则, 编辑了Procfile以同时使用-c和-C选项(服务器和应用程序配置文件), 将应用程序buildpack设置为默认值之一-“ heroku / php”。 当前,仅覆盖一个文件而不是整个仓库。 当builpack repo更改时,这将减少构建失败。

将您的Chrome扩展程序更改为Firefox加载项
将您的Chrome扩展程序更改为Firefox加载项

Chrome扩展程序非常流行,Chrome浏览器有很多很棒的扩展程序。 但是,如果您还想构建Firefox附加组件,该怎么办。 您需要WebExtension API。 它是用于构建Firefox附加组件的扩展API。 它还可以帮助您构建跨浏览器扩展。 什么是WebExtension WebExtension是跨浏览器扩展API,适用于Firefox,Google Chrome,Opera等现代浏览器。 要遵循此API,您只需构建扩展一次,即可在任何地方运行它。 Firefox和Chrome之间的区别 Firefox扩展与WebExtension API完全兼容。 但是Google Chrome浏览器存在一些差异。 1.全局变量 在Chrome扩展程序中,您可以获得命名空间“ chrome”,可用于使用Chrome扩展程序API。 使用WebExtension时,应该使用“浏览器”来获取浏览器API。 但是在Firefox中,它仍然提供您在Chrome中使用的“ chrome”。 2. iframe 在Chrome中,如果您在本地扩展程序中托管html文件,然后使用iframe将此页面注入网站,则仍可以在其中使用完整的扩展程序API。 但是在Firefox中,此iframe与普通网页相同,您不能在其中使用完整的扩展API。 3.扩展名 在Chrome中,每个扩展程序都有一个唯一的扩展程序ID,在不同的计算机上安装时,该ID相同。 但是对于Firefox,每次安装的扩展名ID都会不同。 因此,请记住使用扩展API获取当前的扩展ID。 不要硬编码扩展ID。 4.带有承诺的扩展API 在chrome扩展程序中,大多数API与回调一起使用。 但是在Firefox中,内置了诺言。 5.`manifest.json`中的一些不同的键 现在,您还需要为不同的浏览器构建不同的清单文件。 您可以在此处获得更多详细的区别。 帮助构建WebExtension的库 您可以使用`webextension-polyfill`库来帮助您避免Chrome和Firefox之间的某些差异。 通过`webextension-polyfill`,您还可以在带有承诺的chrome扩展中使用浏览器名称空间。 var browser = require(“ webextension-polyfill”); browser.tabs.sendMessage(tabId,“ get-ids”)。then(结果=> { processResults(结果); }); 结论 如果您在构建chrome扩展程序时遵循WebExtension API,则只需少量工作即可将chrome扩展程序迁移到Firefox加载项。 借助WebExtension API,您还可以使用Promise API来使代码更干净。 […]