<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>renyuanz (RenyuanZ)</title>
    <link>https://ruby-china.org/renyuanz</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>「大型 Q&amp;A」有人对开发 Shopify App 感兴趣吗？</title>
      <description>&lt;p&gt;从疫情开始，海外电商成倍速增长，电商独立站成为了一个新的赛道。Shopify 作为电商独立站建站行业的佼佼者，最近几年有点猛，生态也越做越好了。做 Shopify app 也可以像 iOS App 那样收费，尤其是前几个月 Shopify Unite 大会宣布取消了开发者收入前一百万美元的佣金，更是利好独立开发者和小团队，这个行业还是早期，但是已经出了很多亿级融资的 toB SaaS 公司。&lt;/p&gt;

&lt;p&gt;Shopify 在 Ruby 社区里更是灯塔一般的存在，我觉得很大程度上也是因为 Rails 社区里这么多年商业模型的沉淀和极高的生产力。我个人认为这是一个很不错的契机去盘活 Ruby 社区在国内的影响力，因为 Ruby 可能在 toC 场景有着一些天生的劣势（性能不佳），但是却在 toB 场景有着无可匹敌的优势（生产力高）。我虽然现在没有在工作中运用太多 Ruby（我现在以前端和 Nodejs 为主），但是依旧从心底爱着 Ruby 这门语言，所以想来社区里做个分享问答，大家有关于 Shopify app 开发、海外电商、海外 SaaS 相关的问题都可以向我提问，知无不言 &lt;img title=":stuck_out_tongue_closed_eyes:" alt="😝" src="https://twemoji.ruby-china.com/2/svg/1f61d.svg" class="twemoji"&gt; &lt;/p&gt;

&lt;p&gt;9/20 补充：
发现有些朋友会私信我，而我有时候回的比较慢，你们也可以加我的微信：zrylise，注明：Ruby China&lt;/p&gt;</description>
      <author>renyuanz</author>
      <pubDate>Sun, 19 Sep 2021 14:22:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/41701</link>
      <guid>https://ruby-china.org/topics/41701</guid>
    </item>
    <item>
      <title>Sappagram：用代码在线生成微服务架构图</title>
      <description>&lt;h2 id="Sappagram"&gt;Sappagram&lt;/h2&gt;
&lt;p&gt;一个在线通过代码生成微服务架构图的网站。&lt;/p&gt;

&lt;p&gt;Demo：&lt;a href="https://sappagram.herokuapp.com" rel="nofollow" target="_blank"&gt;https://sappagram.herokuapp.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/b67e8853-c5f8-456c-8138-fc2429266980.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;公司最近在收集各技术团队的痛点，有同事提了一个 —— 项目增长过于粗放，缺少架构图很难理解微服务下各个服务的角色和作用。于是我谷歌了一下，搜到一个 python 的库，可以通过代码生成架构图。&lt;a href="https://github.com/mingrammer/diagrams" rel="nofollow" target="_blank"&gt;https://github.com/mingrammer/diagrams&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;但是我不太熟悉 python，装环境装了半天，心想别人碰到这么好用的库，但是不熟悉 python 而流失了那多可惜，有一个 web 服务多好啊。&lt;/p&gt;

&lt;p&gt;于是就有了 Sappagram&lt;/p&gt;
&lt;h2 id="功能"&gt;功能&lt;/h2&gt;
&lt;p&gt;目前只有一个，就是有一个代码编辑器，把 Diagrams 的代码（示例看这里： &lt;a href="https://diagrams.mingrammer.com/docs/getting-started/examples" rel="nofollow" target="_blank"&gt;https://diagrams.mingrammer.com/docs/getting-started/examples&lt;/a&gt; ）放到编辑器里，然后点“submit”等待一会儿就可以看到生成的架构图了。&lt;/p&gt;

&lt;p&gt;它支持几乎所有云服务的节点，也可以使用自定义节点，总之用起来非常简单！&lt;/p&gt;

&lt;p&gt;暂时还没有开源（为了快速上线，代码写太烂了。。），后面会考虑开源的～&lt;/p&gt;</description>
      <author>renyuanz</author>
      <pubDate>Wed, 09 Sep 2020 11:02:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/40394</link>
      <guid>https://ruby-china.org/topics/40394</guid>
    </item>
    <item>
      <title>写了个 Ruby China 的 GraphQL API</title>
      <description>&lt;p&gt;上个周末想试用下 Typescript 和 Fastify（一个 node.js 的框架），想找个什么项目练练手，于是就动起了给 Ruby China 写 GraphQL API 的念头。&lt;/p&gt;

&lt;p&gt;Live demo:&lt;a href="https://ruby-china-graphql-api.vercel.app/api/graphql" rel="nofollow" target="_blank"&gt;https://ruby-china-graphql-api.vercel.app/api/graphql&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;项目开源在 Github：&lt;a href="https://github.com/renyuanz/ruby-china-graphql-api" rel="nofollow" target="_blank"&gt;https://github.com/renyuanz/ruby-china-graphql-api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;完成度大概是 30%，只接了一部分的 GET 接口：&lt;/p&gt;
&lt;h2 id="Query"&gt;Query&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;topics: [Topic!]&lt;/li&gt;
&lt;li&gt;topic(id: ID!): Topic&lt;/li&gt;
&lt;li&gt;me: UserMe!&lt;/li&gt;
&lt;li&gt;nodes: [Node!]&lt;/li&gt;
&lt;li&gt;node(id: ID!): Node&lt;/li&gt;
&lt;li&gt;users(limit: Int): [User]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="有什么特别的地方："&gt;有什么特别的地方：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;基于 Fastify，性能快&lt;/li&gt;
&lt;li&gt;用 Typescript 和 graphql-codegen 自动从 Schema.graphql 生成 resolvers 类型&lt;/li&gt;
&lt;li&gt;Oauth2 集成，修改配置后可以直接适用于任何基于 homeland 搭建的项目&lt;/li&gt;
&lt;li&gt;魔改了 GraphiQL，增加了一个登录入口&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;如果你觉得这个项目对你有启发或者有帮助，欢迎给个 star～&lt;/p&gt;</description>
      <author>renyuanz</author>
      <pubDate>Tue, 01 Sep 2020 23:09:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/40354</link>
      <guid>https://ruby-china.org/topics/40354</guid>
    </item>
    <item>
      <title>(转载) 在 Rails 中集成 Vuejs 的四种方法</title>
      <description>&lt;p&gt;英文原版：&lt;a href="https://github.com/chrisvfritz/rails-javascript-integrations" rel="nofollow" target="_blank" title=""&gt;chrisvfritz/rails-javascript-integrations&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="在 Rails 中集成 Vuejs 的四种方法"&gt;在 Rails 中集成 Vuejs 的四种方法&lt;/h2&gt;&lt;h3 id="为什么做?"&gt;为什么做？&lt;/h3&gt;
&lt;p&gt;模块化的视图层让 UI 开发变得异常简单。但开发大规模的 UI 组件并在 Rails 项目中集成一个现代的 JavaScript 框架却有一些棘手。&lt;/p&gt;
&lt;h3 id="怎么做?"&gt;怎么做？&lt;/h3&gt;
&lt;p&gt;这个项目用四种不同的方法集成了 Vuejs 来完成一个简单的 todo list :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/chrisvfritz/rails-javascript-integrations/tree/scoped-jquery" rel="nofollow" target="_blank" title=""&gt;scoped-jquery&lt;/a&gt;&lt;/strong&gt;: 这是我最不推荐的方法。但是，如果你的团队重度使用 jQuery，这可能是一个最简单的方法。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/chrisvfritz/rails-javascript-integrations/tree/vue-simple" rel="nofollow" target="_blank" title=""&gt;vue-simple&lt;/a&gt;&lt;/strong&gt;: 这是一个非常适合现有项目的方案，因为 Vuejs 能很好的与 jQuery 类的库协作。这个方案只需要 1 分钟的配置，非常有效率。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/chrisvfritz/rails-javascript-integrations/tree/vue-browserify" rel="nofollow" target="_blank" title=""&gt;vue-browserify&lt;/a&gt;&lt;/strong&gt;: 推荐给大部分新项目的方案。它大概会花你半小时的配置时间，但是这个方案提供了一个 UMD module 解决方法，可以方便的设置热加载等特性，最棒的是，这个方案非常通俗易懂，如果你还接受不了 webpack 的话，我建议你选这个。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/chrisvfritz/rails-javascript-integrations/tree/vue-webpack" rel="nofollow" target="_blank" title=""&gt;vue-webpack&lt;/a&gt;&lt;/strong&gt;: 推荐给想用 webpack &lt;del&gt;爱折腾&lt;/del&gt;的人。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="具体步骤?"&gt;具体步骤？&lt;/h3&gt;
&lt;p&gt;有两种方法，第一种是查看四种方案依次与前一种作比较的 diff：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/chrisvfritz/rails-javascript-integrations/compare/master...scoped-jquery" rel="nofollow" target="_blank" title=""&gt;master..scoped-jquery&lt;/a&gt;&lt;/strong&gt;: Adds the todo model and API, with a single JavaScript file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/chrisvfritz/rails-javascript-integrations/compare/scoped-jquery...vue-simple" rel="nofollow" target="_blank" title=""&gt;scoped-jquery..vue-simple&lt;/a&gt;&lt;/strong&gt;: Converts the scoped jQuery to a much simpler Vue component.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/chrisvfritz/rails-javascript-integrations/compare/vue-simple...vue-browserify" rel="nofollow" target="_blank" title=""&gt;vue-simple..vue-browserify&lt;/a&gt;&lt;/strong&gt;: Moves all JavaScript to a new &lt;code&gt;frontend&lt;/code&gt; folder managed by Browserify. Components are also organized into more advanced components in &lt;code&gt;.vue&lt;/code&gt; files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/chrisvfritz/rails-javascript-integrations/compare/vue-browserify...vue-webpack" rel="nofollow" target="_blank" title=""&gt;vue-browserify..vue-webpack&lt;/a&gt;&lt;/strong&gt;: Bypasses sprockets and all view-related Rails features, now managing the entire UI in the &lt;code&gt;frontend&lt;/code&gt; folder through Webpack.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;或者，直接看各种方案与&lt;code&gt;master&lt;/code&gt;的 diff：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/chrisvfritz/rails-javascript-integrations/compare/master...scoped-jquery" rel="nofollow" target="_blank" title=""&gt;master..scoped-jquery&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/chrisvfritz/rails-javascript-integrations/compare/master...vue-simple" rel="nofollow" target="_blank" title=""&gt;master..vue-simple&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/chrisvfritz/rails-javascript-integrations/compare/master...vue-browserify" rel="nofollow" target="_blank" title=""&gt;master..vue-browserify&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/chrisvfritz/rails-javascript-integrations/compare/master...vue-webpack" rel="nofollow" target="_blank" title=""&gt;master..vue-webpack&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="有没有 React 的版本？"&gt;有没有 React 的版本？&lt;/h3&gt;
&lt;p&gt;我在过去的一年里大量使用了 React，是 React 给我打开了一扇新的大门，但是我想说的是 React 能做的 Vue 实现起来更简单。
而且，Vue 2.0 就要发布了，新版本的特性让 React 仅存的一些优点也荡然无存了，所以我还是推荐你使用 Vue &lt;img title=":smile:" alt="😄" src="https://twemoji.ruby-china.com/2/svg/1f604.svg" class="twemoji"&gt; &lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;最近在项目里用了 Vue，正好发现了这个，分享给大家。&lt;/p&gt;</description>
      <author>renyuanz</author>
      <pubDate>Tue, 17 May 2016 23:10:02 +0800</pubDate>
      <link>https://ruby-china.org/topics/30051</link>
      <guid>https://ruby-china.org/topics/30051</guid>
    </item>
    <item>
      <title>关于 Turbolinks 5 和 jQuery 的一些疑惑</title>
      <description>&lt;p&gt;最近在做一个新项目，于是尝试更新了 Turbolinks 5，说实话，坑的数量和之前一样多，而且坑的位置还不同了（因为 API 重写了），再加上我一直对 Turbolinks 似懂非懂的，几度让我抓狂到怀疑人生。&lt;/p&gt;

&lt;p&gt;我来描述一下我遇到的问题：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;一些故事背景&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;我使用了一个购买的 bootstrap 主题，里面含有一些基本的 JS，比如折叠菜单按钮，我使用了压缩之后的版本&lt;/li&gt;
&lt;li&gt;一些 jQuery 的插件，geocomplete 和 dataTables&lt;/li&gt;
&lt;li&gt;Turbolinks 5 + jQuery.turbolinks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Application.coffee 的内容如下&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;#= require jquery&lt;/span&gt;
&lt;span class="c1"&gt;#= require jquery_ujs&lt;/span&gt;
&lt;span class="c1"&gt;#= require jquery.turbolinks&lt;/span&gt;

&lt;span class="c1"&gt;#= require theme.min&lt;/span&gt;
&lt;span class="c1"&gt;#= require plugins/jquery.dataTables.min&lt;/span&gt;
&lt;span class="c1"&gt;#= require plugins/jquery.geocomplete&lt;/span&gt;
&lt;span class="c1"&gt;#= require cocoon&lt;/span&gt;
&lt;span class="c1"&gt;#= require data-tables&lt;/span&gt;
&lt;span class="c1"&gt;#= require maps&lt;/span&gt;

&lt;span class="c1"&gt;#= require turbolinks&lt;/span&gt;
&lt;span class="c1"&gt;#= 顺序应该是没问题的，我参考了ruby-china的源码和jQuery.turbolinks的文档&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;值得一提的是（可能是）：theme.min.js 中已经打包进了 jQuery，我不确定在这里引用两次会不会有问题。&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;然后，比如说折叠菜单、dataTables 的初始化都是这样做的：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// App 来自于 theme.min.js&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;BaseTableDatatables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// 这些函数都是在各自的JS文件的结尾处&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;我遇到的问题是：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这些 JS 绑定的事件都只在页面读取的那一刻有用，当点击某个链接后 &lt;code&gt;Turbolinks.visit()&lt;/code&gt; 或使用浏览器 Back / Forward Button 后，这些事件均不再运作。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;尝试过和想到的解决方案：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;把 &lt;code&gt;javascript_include_tag&lt;/code&gt; 放到 body 标签结束之前，但是这个“土方法”似乎在 Turbolinks 5 行不通了，而且这也是官方不建议做的方法。&lt;/li&gt;
&lt;li&gt;把 jQuery.turbolinks 去掉，重新把这些事件绑定在 &lt;code&gt;$(document).on("turbolinks:load", function(){ ... })&lt;/code&gt; 上，但是很显然，有一些功能就被重复绑定了。&lt;/li&gt;
&lt;li&gt;应该有一个专门负责处理这些会被重复绑定事件的 API，比如 &lt;code&gt;$(document).on("turbolinks:before-cache", function(){ ... })&lt;/code&gt;，&lt;a href="https://github.com/turbolinks/turbolinks/issues/7#issuecomment-183059234" rel="nofollow" target="_blank" title=""&gt;参考这里&lt;/a&gt;，但是说实话我没有理解怎么“解绑”事件。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;说实话，JS 真的是一门怎么写都不爽的语言啊……但是现在的应用越来越依赖 JS 了，所以我还是想把这里面的门道弄清，希望各位前辈不吝赐教！&lt;/p&gt;</description>
      <author>renyuanz</author>
      <pubDate>Mon, 07 Mar 2016 00:01:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/29230</link>
      <guid>https://ruby-china.org/topics/29230</guid>
    </item>
  </channel>
</rss>
