{"id":40691,"date":"2023-05-16T07:59:25","date_gmt":"2023-08-10T06:59:21","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%bb%ba%e7%ab%8b%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%bd%e5%a4%9f%e6%90%9c%e7%b4%a2rebuild-fm%e7%9a%84shownote%e7%9a%84%e6%9c%8d%e5%8a%a1%e3%80%82\/"},"modified":"2024-04-30T04:24:15","modified_gmt":"2024-04-29T20:24:15","slug":"%e6%88%91%e5%bb%ba%e7%ab%8b%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%bd%e5%a4%9f%e6%90%9c%e7%b4%a2rebuild-fm%e7%9a%84shownote%e7%9a%84%e6%9c%8d%e5%8a%a1%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%bb%ba%e7%ab%8b%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%bd%e5%a4%9f%e6%90%9c%e7%b4%a2rebuild-fm%e7%9a%84shownote%e7%9a%84%e6%9c%8d%e5%8a%a1%e3%80%82\/","title":{"rendered":"\u6211\u5efa\u7acb\u4e86\u4e00\u4e2a\u80fd\u591f\u641c\u7d22Rebuild.fm\u7684Shownote\u7684\u670d\u52a1"},"content":{"rendered":"<p>\u6211\u5176\u5b9e\u662fRebuild.fm\u7684\u5fe0\u5b9e\u542c\u4f17\u3002<br \/>\nRebuild\u6bcf\u4e00\u671f\u90fd\u6709\u4e30\u5bcc\u7684\u65b0\u6280\u672f\u8bdd\u9898\uff0c\u7136\u540e\u51e0\u4e2a\u6708\u540e\u8fd9\u4e9b\u8bdd\u9898\u5f00\u59cb\u6d41\u884c\uff0c\u5f88\u591a\u65f6\u5019\u90fd\u4f1a\u60f3\u8d77\u90a3\u4e2a\u65f6\u5019\uff0c\u5728Rebuild\u542c\u5230\u7684\u90a3\u4e2a\u8bdd\u9898\uff0c\u7136\u540e\u91cd\u65b0\u56de\u987e\u4e00\u4e0b\u5f53\u65f6\u7684\u90a3\u4e00\u671f\u8282\u76ee\u3002<\/p>\n<p>\u6700\u8fd1\uff0c\u5173\u4e8eRedux\u7684\u8bdd\u9898\u771f\u7684\u5f88\u591a\u3002\u7b2c114\u96c6\u7684\u65f6\u5019\u6211\u7a0d\u5fae\u542c\u8fc7\u4e00\u70b9\uff08Miyagawa\u5148\u751f\u5bf9\u6b64\u4e5f\u6709\u4e00\u4e9b&#8221;\u8fd9\u4e2a\u4f1a\u6d41\u884c\u5417\uff1f&#8221;\u7684\u53cd\u5e94\uff09\uff0c\u4f46\u76f4\u5230\u6211\u5728\u5404\u4e2a\u5730\u65b9\u770b\u5230\u5b83\u7684\u540d\u5b57\uff0c\u8bfb\u4e86Web+DBPress\u7684\u6587\u7ae0\u4e4b\u540e\uff0c\u624d\u60f3\u8d77\u6765\u518d\u6b21\u542c\u4e86\u4e00\u904d\u7b2c114\u96c6\uff0c\u8fd9\u662f\u6700\u8fd1\u7684\u4e8b\u60c5\u3002<\/p>\n<p>\u6240\u4ee5\uff0c\u6211\u7a81\u7136\u60f3\u8981\u8f7b\u677e\u5730\u641c\u7d22\u4e0eRebuild\u4e2d\u70ed\u95e8\u8bdd\u9898\u76f8\u5173\u7684\u8ba8\u8bba\u573a\u666f\u3002<\/p>\n<p>\u7531\u4e8e\u53ef\u4ee5\u4eceRSS\u83b7\u53d6\u6bcf\u4e2a\u5267\u96c6\u548cShownote\u7684\u4fe1\u606f\uff0c\u6240\u4ee5\u5982\u679c\u5c06\u5176\u5b58\u5165\u6570\u636e\u5e93\uff0c\u5c31\u53ef\u4ee5\u8fdb\u884c\u641c\u7d22\u4e86\u3002<br \/>\n\u4e3a\u4e86\u5b66\u4e60\uff0c\u6211\u6b63\u5728\u4f7f\u7528Elasticsearch\u548cReact\uff0c\u4f46\u6211\u8fd8\u4e0d\u80fd\u5f88\u597d\u5730\u4f7f\u7528\u5b83\u4eec\u3002<\/p>\n<p>\u5728\u5f00\u53d1\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u5728\u672c\u5730\u6784\u5efa\u4e86\u4e00\u4e2aRails\u5e94\u7528\u7a0b\u5e8f\uff0c\u5e76\u5728Vagrant\u4e0a\u90e8\u7f72\u4e86Elasticsearch\u3002<\/p>\n<h2>\u5f39\u6027\u641c\u7d22<\/h2>\n<p>\u6211\u5728Vagrant\u4e0a\u901a\u8fc7itamae\u7f16\u5199\u4e86Elasticsearch\u5b89\u88c5\u914d\u7f6e\u7684\u914d\u65b9\u3002<br \/>\n\u8fd9\u4e2a\u914d\u65b9\u5305\u62ec\u4e86Elasticsearch\u672c\u8eab\u548c\u4e00\u4e9b\u63d2\u4ef6\u3002<br \/>\n\u914d\u65b9\u548cVagrantFile\u7b49\u90fd\u4e0eRails\u5e94\u7528\u7a0b\u5e8f\u5206\u522b\u5b58\u653e\u5728\u4ee5\u4e0b\u5b58\u50a8\u5e93\u4e2d\u3002<\/p>\n<p>\u4e2d\u6587\u7684\u9009\u9879\uff1a\u98df\u8c31\/ Elasticsearch\/ \u9ed8\u8ba4.rb<\/p>\n<pre class=\"post-pre\"><code><span class=\"n\">package<\/span> <span class=\"s2\">\"java-1.8.0-openjdk.x86_64\"<\/span> <span class=\"k\">do<\/span>\r\n  <span class=\"n\">action<\/span> <span class=\"ss\">:install<\/span>\r\n<span class=\"k\">end<\/span>\r\n\r\n<span class=\"c1\"># https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/current\/setup-repositories.html<\/span>\r\n<span class=\"n\">template<\/span> <span class=\"s2\">\"\/etc\/yum.repos.d\/elasticsearch.repo\"<\/span> <span class=\"k\">do<\/span>\r\n  <span class=\"n\">user<\/span> <span class=\"s2\">\"root\"<\/span>\r\n  <span class=\"n\">group<\/span> <span class=\"s2\">\"root\"<\/span>\r\n  <span class=\"n\">source<\/span> <span class=\"s2\">\".\/templates\/etc\/yum.repos.d\/elasticsearch.repo.erb\"<\/span>\r\n  <span class=\"n\">not_if<\/span> <span class=\"s2\">\"test -e \/etc\/yum.repos.d\/elasticsearch.repo\"<\/span>\r\n<span class=\"k\">end<\/span>\r\n\r\n<span class=\"n\">package<\/span> <span class=\"s2\">\"elasticsearch\"<\/span> <span class=\"k\">do<\/span>\r\n  <span class=\"n\">action<\/span> <span class=\"ss\">:install<\/span>\r\n<span class=\"k\">end<\/span>\r\n\r\n<span class=\"c1\"># kuromoji<\/span>\r\n<span class=\"c1\"># https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/plugins\/2.0\/analysis-kuromoji.html<\/span>\r\n<span class=\"n\">execute<\/span> <span class=\"s2\">\"install analysis-kuromoji\"<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"n\">user<\/span> <span class=\"s2\">\"root\"<\/span>\r\n    <span class=\"n\">cwd<\/span> <span class=\"s2\">\"\/usr\/share\/elasticsearch\"<\/span>\r\n    <span class=\"n\">command<\/span> <span class=\"s2\">\"bin\/plugin install analysis-kuromoji\"<\/span>\r\n  <span class=\"n\">not_if<\/span> <span class=\"s2\">\"test -e \/usr\/share\/elasticsearch\/plugins\/analysis-kuromoji\"<\/span>\r\n<span class=\"k\">end<\/span>\r\n\r\n<span class=\"n\">template<\/span> <span class=\"s2\">\"\/etc\/elasticsearch\/elasticsearch.yml\"<\/span> <span class=\"k\">do<\/span>\r\n  <span class=\"n\">user<\/span> <span class=\"s2\">\"root\"<\/span>\r\n  <span class=\"n\">group<\/span> <span class=\"s2\">\"root\"<\/span>\r\n  <span class=\"n\">source<\/span> <span class=\"s2\">\".\/templates\/etc\/elasticsearch.yml.erb\"<\/span>\r\n<span class=\"k\">end<\/span>\r\n\r\n<span class=\"c1\"># user,group\u3092elasticsearch\u306b\u3057\u306a\u3044\u3068\u30b5\u30fc\u30d3\u30b9\u8d77\u52d5\u3067\u30a8\u30e9\u30fc\u306b\u306a\u308b<\/span>\r\n<span class=\"n\">execute<\/span> <span class=\"s2\">\"change owner to elasticsearch\"<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"n\">user<\/span> <span class=\"s2\">\"root\"<\/span>\r\n    <span class=\"n\">cwd<\/span> <span class=\"s2\">\"\/etc\/\"<\/span>\r\n    <span class=\"n\">command<\/span> <span class=\"s2\">\"chown -R elasticsearch elasticsearch;chgrp -R elasticsearch elasticsearch\"<\/span>\r\n<span class=\"k\">end<\/span>\r\n<\/code><\/pre>\n<h2>Rails + Elasticsearch\uff1aRails\u6846\u67b6\u548cElasticsearch\u7684\u7ed3\u5408<\/h2>\n<p>\u6211\u6b63\u5728\u53c2\u8003\u4ee5\u4e0b\u6587\u7ae0\u5c06elasticsearch-rails gem\u96c6\u6210\u5230Rails\u4e2d\u3002<\/p>\n<p>\u4f7f\u7528Elasticsearch\u521b\u5efa\u4e00\u4e2a\u4f7f\u7528Rails\u7684\u793a\u4f8b\u5e94\u7528\u7a0b\u5e8f<\/p>\n<p>\u5927\u90e8\u5206\u662f\u4f7f\u7528\u4e0a\u8ff0\u793a\u4f8b\u4ee3\u7801\u7684\u539f\u6837\u3002<br \/>\n\u7531\u4e8eElasticsearch\u662f\u5728Vagrant\u4e0a\u6784\u5efa\u7684\uff0c\u6240\u4ee5\u5728\u6a21\u578b\u5185\u8bbe\u7f6e\u4e86\u865a\u62df\u673a\u7684\u4e3b\u673a\u540d\u3002<\/p>\n<p>\u5f00\u53d1\u73af\u5883\u914d\u7f6e\u6587\u4ef6\uff1aconfig\/environments\/development.rb<\/p>\n<pre class=\"post-pre\"><code><span class=\"no\">Rails<\/span><span class=\"p\">.<\/span><span class=\"nf\">application<\/span><span class=\"p\">.<\/span><span class=\"nf\">configure<\/span> <span class=\"k\">do<\/span>\r\n  <span class=\"c1\"># elasticsearch server host<\/span>\r\n  <span class=\"n\">config<\/span><span class=\"p\">.<\/span><span class=\"nf\">elasticsearch_server_host<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"192.168.33.10:9200\"<\/span>\r\n<span class=\"k\">end<\/span>\r\n<\/code><\/pre>\n<p>app\/models\/shownote.rb \u7684\u5185\u5bb9<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\"># == Schema Information<\/span>\r\n<span class=\"c1\">#<\/span>\r\n<span class=\"c1\"># Table name: shownotes<\/span>\r\n<span class=\"c1\">#<\/span>\r\n<span class=\"c1\">#  id         :integer          not null, primary key<\/span>\r\n<span class=\"c1\">#  episode_id :integer<\/span>\r\n<span class=\"c1\">#  title      :string<\/span>\r\n<span class=\"c1\">#  link        :string<\/span>\r\n<span class=\"c1\">#  created_at :datetime         not null<\/span>\r\n<span class=\"c1\">#  updated_at :datetime         not null<\/span>\r\n<span class=\"c1\">#<\/span>\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">Shownote<\/span> <span class=\"o\">&lt;<\/span> <span class=\"no\">ActiveRecord<\/span><span class=\"o\">::<\/span><span class=\"no\">Base<\/span>\r\n  <span class=\"n\">belongs_to<\/span> <span class=\"ss\">:episode<\/span><span class=\"p\">,<\/span> <span class=\"ss\">foreign_key: :episode_id<\/span><span class=\"p\">,<\/span> <span class=\"ss\">class_name: :Episode<\/span>\r\n\r\n  <span class=\"kp\">include<\/span> <span class=\"no\">Elasticsearch<\/span><span class=\"o\">::<\/span><span class=\"no\">Model<\/span>\r\n\r\n  <span class=\"nb\">self<\/span><span class=\"p\">.<\/span><span class=\"nf\">__elasticsearch__<\/span><span class=\"p\">.<\/span><span class=\"nf\">client<\/span> <span class=\"o\">=<\/span> <span class=\"no\">Elasticsearch<\/span><span class=\"o\">::<\/span><span class=\"no\">Client<\/span><span class=\"p\">.<\/span><span class=\"nf\">new<\/span> <span class=\"ss\">host: <\/span><span class=\"no\">RebuildFulltextSearch<\/span><span class=\"o\">::<\/span><span class=\"no\">Application<\/span><span class=\"p\">.<\/span><span class=\"nf\">config<\/span><span class=\"p\">.<\/span><span class=\"nf\">elasticsearch_server_host<\/span><span class=\"p\">,<\/span> <span class=\"ss\">log: <\/span><span class=\"kp\">true<\/span>\r\n\r\n  <span class=\"no\">INDEX_FIELDS<\/span> <span class=\"o\">=<\/span> <span class=\"sx\">%w(title link)<\/span><span class=\"p\">.<\/span><span class=\"nf\">freeze<\/span>\r\n  <span class=\"n\">index_name<\/span> <span class=\"s2\">\"rebuild_shownote_<\/span><span class=\"si\">#{<\/span><span class=\"no\">Rails<\/span><span class=\"p\">.<\/span><span class=\"nf\">env<\/span><span class=\"si\">}<\/span><span class=\"s2\">\"<\/span>\r\n\r\n  <span class=\"n\">settings<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"n\">mappings<\/span> <span class=\"ss\">dynamic: <\/span><span class=\"s2\">\"false\"<\/span> <span class=\"k\">do<\/span>\r\n      <span class=\"n\">indexes<\/span> <span class=\"ss\">:title<\/span><span class=\"p\">,<\/span> <span class=\"ss\">analyzer: <\/span><span class=\"s2\">\"kuromoji\"<\/span><span class=\"p\">,<\/span> <span class=\"ss\">type: <\/span><span class=\"s2\">\"string\"<\/span>\r\n      <span class=\"n\">indexes<\/span> <span class=\"ss\">:link<\/span><span class=\"p\">,<\/span>  <span class=\"ss\">analyzer: <\/span><span class=\"s2\">\"kuromoji\"<\/span><span class=\"p\">,<\/span> <span class=\"ss\">type: <\/span><span class=\"s2\">\"string\"<\/span>\r\n    <span class=\"k\">end<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">as_indexed_json<\/span><span class=\"p\">(<\/span><span class=\"n\">options<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{})<\/span>\r\n    <span class=\"nb\">self<\/span><span class=\"p\">.<\/span><span class=\"nf\">as_json<\/span><span class=\"p\">.<\/span><span class=\"nf\">select<\/span><span class=\"p\">{<\/span><span class=\"o\">|<\/span><span class=\"n\">k<\/span><span class=\"p\">,<\/span> <span class=\"n\">_<\/span><span class=\"o\">|<\/span> <span class=\"no\">INDEX_FIELDS<\/span><span class=\"p\">.<\/span><span class=\"nf\">include?<\/span><span class=\"p\">(<\/span><span class=\"n\">k<\/span><span class=\"p\">)<\/span> <span class=\"p\">}<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"nc\">self<\/span><span class=\"o\">.<\/span><span class=\"nf\">create_index!<\/span>\r\n    <span class=\"n\">client<\/span> <span class=\"o\">=<\/span> <span class=\"n\">__elasticsearch__<\/span><span class=\"p\">.<\/span><span class=\"nf\">client<\/span>\r\n    <span class=\"n\">client<\/span><span class=\"p\">.<\/span><span class=\"nf\">indices<\/span><span class=\"p\">.<\/span><span class=\"nf\">delete<\/span> <span class=\"ss\">index: <\/span><span class=\"nb\">self<\/span><span class=\"p\">.<\/span><span class=\"nf\">index_name<\/span> <span class=\"k\">rescue<\/span> <span class=\"kp\">nil<\/span>\r\n    <span class=\"n\">client<\/span><span class=\"p\">.<\/span><span class=\"nf\">indices<\/span><span class=\"p\">.<\/span><span class=\"nf\">create<\/span><span class=\"p\">(<\/span>\r\n      <span class=\"ss\">index: <\/span><span class=\"nb\">self<\/span><span class=\"p\">.<\/span><span class=\"nf\">index_name<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"ss\">body: <\/span><span class=\"p\">{<\/span>\r\n        <span class=\"ss\">settings: <\/span><span class=\"nb\">self<\/span><span class=\"p\">.<\/span><span class=\"nf\">settings<\/span><span class=\"p\">.<\/span><span class=\"nf\">to_hash<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"ss\">mappings: <\/span><span class=\"nb\">self<\/span><span class=\"p\">.<\/span><span class=\"nf\">mappings<\/span><span class=\"p\">.<\/span><span class=\"nf\">to_hash<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"p\">)<\/span>\r\n  <span class=\"k\">end<\/span>\r\n<span class=\"k\">end<\/span>\r\n<\/code><\/pre>\n<p>\u5e94\u7528\u7a0b\u5e8f\/\u63a7\u5236\u5668\/\u663e\u793a\u7b14\u8bb0\u63a7\u5236\u5668<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\"># GET \/shownotes<\/span>\r\n<span class=\"c1\"># GET \/shownotes.json<\/span>\r\n<span class=\"k\">def<\/span> <span class=\"nf\">index<\/span>\r\n  <span class=\"vi\">@shownotes<\/span> <span class=\"o\">=<\/span> <span class=\"k\">if<\/span> <span class=\"n\">params<\/span><span class=\"p\">[<\/span><span class=\"ss\">:search<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"no\">Shownote<\/span><span class=\"p\">.<\/span><span class=\"nf\">search<\/span><span class=\"p\">(<\/span><span class=\"n\">query<\/span><span class=\"p\">:{<\/span><span class=\"ss\">match: <\/span><span class=\"p\">{<\/span><span class=\"ss\">_all: <\/span><span class=\"n\">params<\/span><span class=\"p\">[<\/span><span class=\"ss\">:search<\/span><span class=\"p\">]<\/span> <span class=\"p\">}}).<\/span><span class=\"nf\">records<\/span>\r\n  <span class=\"k\">else<\/span>\r\n    <span class=\"no\">Shownote<\/span><span class=\"p\">.<\/span><span class=\"nf\">includes<\/span><span class=\"p\">(<\/span><span class=\"ss\">:episode<\/span><span class=\"p\">).<\/span><span class=\"nf\">all<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"k\">if<\/span> <span class=\"n\">request<\/span><span class=\"p\">.<\/span><span class=\"nf\">format<\/span><span class=\"p\">.<\/span><span class=\"nf\">to_s<\/span> <span class=\"o\">==<\/span> <span class=\"s2\">\"application\/json\"<\/span>\r\n    <span class=\"vi\">@shownotes<\/span> <span class=\"o\">=<\/span> <span class=\"vi\">@shownotes<\/span><span class=\"p\">.<\/span><span class=\"nf\">map<\/span><span class=\"p\">{<\/span><span class=\"o\">|<\/span><span class=\"n\">r<\/span><span class=\"o\">|<\/span>\r\n      <span class=\"p\">{<\/span>\r\n        <span class=\"ss\">id: <\/span><span class=\"n\">r<\/span><span class=\"p\">.<\/span><span class=\"nf\">id<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"ss\">episode_id: <\/span><span class=\"n\">r<\/span><span class=\"p\">.<\/span><span class=\"nf\">episode_id<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"ss\">title: <\/span><span class=\"n\">r<\/span><span class=\"p\">.<\/span><span class=\"nf\">title<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"ss\">link: <\/span><span class=\"n\">r<\/span><span class=\"p\">.<\/span><span class=\"nf\">link<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"ss\">episode_no: <\/span><span class=\"n\">r<\/span><span class=\"p\">.<\/span><span class=\"nf\">episode<\/span><span class=\"p\">.<\/span><span class=\"nf\">episode_no<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"ss\">episode_title: <\/span><span class=\"n\">r<\/span><span class=\"p\">.<\/span><span class=\"nf\">episode<\/span><span class=\"p\">.<\/span><span class=\"nf\">title<\/span> <span class=\"p\">,<\/span>\r\n        <span class=\"ss\">episode_subtitle: <\/span><span class=\"n\">r<\/span><span class=\"p\">.<\/span><span class=\"nf\">episode<\/span><span class=\"p\">.<\/span><span class=\"nf\">subtitle<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"ss\">episode_link: <\/span><span class=\"n\">r<\/span><span class=\"p\">.<\/span><span class=\"nf\">episode<\/span><span class=\"p\">.<\/span><span class=\"nf\">link<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"ss\">episode_pubdate: <\/span><span class=\"n\">r<\/span><span class=\"p\">.<\/span><span class=\"nf\">episode<\/span><span class=\"p\">.<\/span><span class=\"nf\">pubdate<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n<span class=\"k\">end<\/span>\r\n\r\n<\/code><\/pre>\n<h2>\u56de\u5e94<\/h2>\n<p>\u524d\u7aef\u662f\u7528React+Redux\u5b9e\u73b0\u7684\u3002<br \/>\n\u8fd9\u4e2a\u5e94\u7528\u7a0b\u5e8f\u7684\u52a8\u4f5c\u5f88\u5c11\uff0c\u6240\u4ee5\u7528Redux\u6ca1\u6709\u592a\u591a\u610f\u4e49\u3002<br \/>\n\u4ee3\u7801\u662f\u53c2\u8003Web+DBPress Vol.92\u7279\u8f91\u4e2d\u7684\u5185\u5bb9\u3002<\/p>\n<p>\u987a\u4fbf\u8bf4\u4e00\u4e0b\uff0c\u7b2c92\u671f\u4e2d\u9664\u4e86\u6709\u5173Redux\u7684\u6587\u7ae0\u5916\uff0c\u8fd8\u6536\u5f55\u4e86\u4f7f\u7528Rails+React\u6784\u5efa\u7684TODO\u5e94\u7528\u7a0b\u5e8f\u793a\u4f8b\uff0c\u975e\u5e38\u6709\u53c2\u8003\u4ef7\u503c\u3002<\/p>\n<p>\u4f7f\u7528superagent\u8fdb\u884c\u5411\u670d\u52a1\u5668\u7aef\u53d1\u9001\u8bf7\u6c42\uff0c\u5e76\u63a5\u6536\u4ee5JSON\u683c\u5f0f\u8fd4\u56de\u7684\u54cd\u5e94\u3002<\/p>\n<p>\u524d\u7aef\/src\/app.jsx<\/p>\n<pre class=\"post-pre\"><code>\r\n  <span class=\"nx\">onKyewordChange<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">){<\/span>\r\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">setState<\/span><span class=\"p\">({<\/span><span class=\"na\">keyword<\/span><span class=\"p\">:<\/span> <span class=\"nx\">e<\/span><span class=\"p\">.<\/span><span class=\"nx\">target<\/span><span class=\"p\">.<\/span><span class=\"nx\">value<\/span><span class=\"p\">});<\/span>\r\n\r\n    <span class=\"kd\">var<\/span> <span class=\"nx\">url<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/shownotes.json?search=<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">state<\/span><span class=\"p\">.<\/span><span class=\"nx\">keyword<\/span>\r\n    <span class=\"nx\">request<\/span><span class=\"p\">.<\/span><span class=\"kd\">get<\/span><span class=\"p\">(<\/span><span class=\"nx\">url<\/span><span class=\"p\">)<\/span>\r\n      <span class=\"p\">.<\/span><span class=\"nx\">accept<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">application\/json<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)<\/span>\r\n      <span class=\"p\">.<\/span><span class=\"nx\">end<\/span><span class=\"p\">((<\/span><span class=\"nx\">err<\/span><span class=\"p\">,<\/span> <span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span> <span class=\"o\">||<\/span> <span class=\"o\">!<\/span><span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nx\">ok<\/span><span class=\"p\">){<\/span>\r\n          <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">error<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">url<\/span><span class=\"p\">,<\/span> <span class=\"nx\">status<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span><span class=\"p\">.<\/span><span class=\"nx\">toString<\/span><span class=\"p\">())<\/span>\r\n        <span class=\"p\">}<\/span>\r\n        <span class=\"k\">else<\/span><span class=\"p\">{<\/span>\r\n          <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">setState<\/span><span class=\"p\">({<\/span><span class=\"na\">data<\/span><span class=\"p\">:<\/span> <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nx\">body<\/span><span class=\"p\">})<\/span>\r\n        <span class=\"p\">}<\/span>\r\n      <span class=\"p\">})<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u4f7f\u7528webpack\u6765\u7f16\u8bd1jsx\u6587\u4ef6\u65f6\uff0c\u6211\u66fe\u4e3a\u5982\u4f55\u5c06\u5176\u96c6\u6210\u5230Rails\u7684\u914d\u7f6e\u76ee\u5f55\u4e2d\u800c\u70e6\u607c\uff0c\u4f46\u53c2\u8003\u4e86\u4e0b\u9762\u7684\u6587\u7ae0\u540e\uff0c\u6211\u521b\u5efa\u4e86\u4e00\u4e2afrontend\u76ee\u5f55\uff0c\u5e76\u5c06\u5176\u4e2d\u7684package.json\u548c\u5176\u4ed6\u4e00\u4e9b\u6587\u4ef6\u653e\u5165\u5176\u4e2d\u3002<br \/>\n\u5f53\u6211\u8981\u7f16\u5199jsx\u65f6\uff0c\u6211\u4f1a\u5207\u6362\u5230frontend\u76ee\u5f55\u4e0b\u6267\u884c&#8221;webpack &#8211;watch&#8221;\u547d\u4ee4\u3002<\/p>\n<p>\u4f7f\u7528Webpack\u53ef\u4ee5\u65b9\u4fbf\u5730\u5c06JavaScript\u4eceRails\u4e2d\u5206\u79bb\u5e76\u8fbe\u5230\u826f\u597d\u7684\u6548\u679c\u3002<\/p>\n<pre class=\"post-pre\"><code>$ tree -L 3\r\n.\r\n\u251c\u2500\u2500 app\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assets\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 javascripts\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 stylesheets\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 controllers\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 application_controller.rb\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 concerns\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 episodes_controller.rb\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 main_controller.rb\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 shownotes_controller.rb\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 helpers\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 mailers\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 models\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 concerns\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 episode.rb\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 shownote.rb\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 views\r\n\u2502\u00a0\u00a0     \u251c\u2500\u2500 episodes\r\n\u2502\u00a0\u00a0     \u251c\u2500\u2500 layouts\r\n\u2502\u00a0\u00a0     \u251c\u2500\u2500 main\r\n\u2502\u00a0\u00a0     \u2514\u2500\u2500 shownotes\r\n\u251c\u2500\u2500 bin\r\n\u251c\u2500\u2500 config\r\n\u251c\u2500\u2500 config.ru\r\n\u251c\u2500\u2500 db\r\n\u251c\u2500\u2500 frontend\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 package.json\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 src\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 app.jsx\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 webpack.config.js\r\n\u251c\u2500\u2500 lib\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assets\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 tasks\r\n\u2502\u00a0\u00a0     \u251c\u2500\u2500 elasticsearch.rake\r\n\u2502\u00a0\u00a0     \u2514\u2500\u2500 rebuild.rake\r\n<\/code><\/pre>\n<h2>\u753b\u9762\u8bbe\u8ba1<\/h2>\n<p>\u6211\u5011\u4f7f\u7528\u4e86Bulma\u7684\u7d44\u4ef6\u9032\u884c\u69cb\u5efa\u3002<\/p>\n<p>\u4e0d\u77e5\u600e\u5730\uff0c\u6211\u89c9\u5f97\u82b1\u8d39\u6700\u591a\u65f6\u95f4\u7684\u90e8\u5206\u662f\u8fd9\u4e2a\u8bbe\u8ba1\u3002\u6700\u5f00\u59cb\u7684\u8c03\u8272\u65b9\u5f0f\u8fd8\u662f\u4fdd\u6301\u4e86bulma\u7684\u9ed8\u8ba4\u914d\u8272\uff0c\u4f46\u6211\u53cd\u590d\u65e0\u6570\u6b21\u5730\u8c03\u6574\u4e86\u8fd9\u4e2a\u4e0d\u597d\u90a3\u4e2a\u4e0d\u597d\u7684\u3002<\/p>\n<p>\u7ec4\u4ef6\u7684\u5e03\u5c40\u6ca1\u6709\u6539\u53d8\uff0c\u53ea\u662f\u5728\u8c03\u6574\u80cc\u666f\u548c\u989c\u8272\u7b49\u7ec6\u8282\uff0c\u4f46\u662f\u59cb\u7ec8\u65e0\u6cd5\u8fbe\u5230\u6211\u559c\u6b22\u7684\u611f\u89c9\u3002<br \/>\n\u4ee5\u4e0b\u662f\u4fee\u6b63\u8fc7\u7a0b\u4e2d\u7684\u5185\u5bb9\u3002\u5f88\u96be\u8fa8\u8bc6\u5427\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d427d37434c4406c995aa\/36-0.png\" alt=\"\" \/><\/div>\n<p>\u6211\u8ba4\u4e3a\u73b0\u5728\u7684\u4e1c\u897f\u5df2\u7ecf\u53d8\u5f97\u5f88\u4e0d\u9519\u4e86\uff0c\u4f60\u89c9\u5f97\u600e\u4e48\u6837\u5462\uff1f<br \/>\n\u56e0\u4e3a\u4e3b\u9898\u989c\u8272\u548c\u80cc\u666f\u56fe\u7247\u90fd\u5b8c\u7f8e\u5730\u914d\u5408\u5728\u4e00\u8d77\uff0c\u6240\u4ee5\u6211\u4eec\u51b3\u5b9a\u91c7\u7528\u3002<br \/>\n\u771f\u5e0c\u671b\u4e00\u6b21\u5c31\u80fd\u505a\u51fa\u8fd9\u6837\u7684\u4e1c\u897f\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d427d37434c4406c995aa\/38-0.png\" alt=\"\" \/><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u6211\u5176\u5b9e\u662fRebuild.fm\u7684\u5fe0\u5b9e\u542c\u4f17\u3002 Rebuild\u6bcf\u4e00\u671f\u90fd\u6709\u4e30\u5bcc\u7684\u65b0\u6280\u672f\u8bdd\u9898\uff0c\u7136\u540e\u51e0\u4e2a\u6708\u540e\u8fd9\u4e9b\u8bdd\u9898\u5f00\u59cb\u6d41 [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-40691","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u6211\u5efa\u7acb\u4e86\u4e00\u4e2a\u80fd\u591f\u641c\u7d22Rebuild.fm\u7684Shownote\u7684\u670d\u52a1 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u5efa\u7acb\u4e86\u4e00\u4e2a\u80fd\u591f\u641c\u7d22rebuild-fm\u7684shownote\u7684\u670d\u52a1\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u6211\u5efa\u7acb\u4e86\u4e00\u4e2a\u80fd\u591f\u641c\u7d22Rebuild.fm\u7684Shownote\u7684\u670d\u52a1\" \/>\n<meta property=\"og:description\" content=\"\u6211\u5176\u5b9e\u662fRebuild.fm\u7684\u5fe0\u5b9e\u542c\u4f17\u3002 Rebuild\u6bcf\u4e00\u671f\u90fd\u6709\u4e30\u5bcc\u7684\u65b0\u6280\u672f\u8bdd\u9898\uff0c\u7136\u540e\u51e0\u4e2a\u6708\u540e\u8fd9\u4e9b\u8bdd\u9898\u5f00\u59cb\u6d41 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u5efa\u7acb\u4e86\u4e00\u4e2a\u80fd\u591f\u641c\u7d22rebuild-fm\u7684shownote\u7684\u670d\u52a1\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-10T06:59:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T20:24:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d427d37434c4406c995aa\/36-0.png\" \/>\n<meta name=\"author\" content=\"\u65b0, \u97f5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u65b0, \u97f5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%bb%ba%e7%ab%8b%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%bd%e5%a4%9f%e6%90%9c%e7%b4%a2rebuild-fm%e7%9a%84shownote%e7%9a%84%e6%9c%8d%e5%8a%a1%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%bb%ba%e7%ab%8b%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%bd%e5%a4%9f%e6%90%9c%e7%b4%a2rebuild-fm%e7%9a%84shownote%e7%9a%84%e6%9c%8d%e5%8a%a1%e3%80%82\/\",\"name\":\"\u6211\u5efa\u7acb\u4e86\u4e00\u4e2a\u80fd\u591f\u641c\u7d22Rebuild.fm\u7684Shownote\u7684\u670d\u52a1 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-08-10T06:59:21+00:00\",\"dateModified\":\"2024-04-29T20:24:15+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%bb%ba%e7%ab%8b%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%bd%e5%a4%9f%e6%90%9c%e7%b4%a2rebuild-fm%e7%9a%84shownote%e7%9a%84%e6%9c%8d%e5%8a%a1%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%bb%ba%e7%ab%8b%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%bd%e5%a4%9f%e6%90%9c%e7%b4%a2rebuild-fm%e7%9a%84shownote%e7%9a%84%e6%9c%8d%e5%8a%a1%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%bb%ba%e7%ab%8b%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%bd%e5%a4%9f%e6%90%9c%e7%b4%a2rebuild-fm%e7%9a%84shownote%e7%9a%84%e6%9c%8d%e5%8a%a1%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u6211\u5efa\u7acb\u4e86\u4e00\u4e2a\u80fd\u591f\u641c\u7d22Rebuild.fm\u7684Shownote\u7684\u670d\u52a1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9\",\"name\":\"\u65b0, \u97f5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"caption\":\"\u65b0, \u97f5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%bb%ba%e7%ab%8b%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%bd%e5%a4%9f%e6%90%9c%e7%b4%a2rebuild-fm%e7%9a%84shownote%e7%9a%84%e6%9c%8d%e5%8a%a1%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u6211\u5efa\u7acb\u4e86\u4e00\u4e2a\u80fd\u591f\u641c\u7d22Rebuild.fm\u7684Shownote\u7684\u670d\u52a1 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u5efa\u7acb\u4e86\u4e00\u4e2a\u80fd\u591f\u641c\u7d22rebuild-fm\u7684shownote\u7684\u670d\u52a1\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u6211\u5efa\u7acb\u4e86\u4e00\u4e2a\u80fd\u591f\u641c\u7d22Rebuild.fm\u7684Shownote\u7684\u670d\u52a1","og_description":"\u6211\u5176\u5b9e\u662fRebuild.fm\u7684\u5fe0\u5b9e\u542c\u4f17\u3002 Rebuild\u6bcf\u4e00\u671f\u90fd\u6709\u4e30\u5bcc\u7684\u65b0\u6280\u672f\u8bdd\u9898\uff0c\u7136\u540e\u51e0\u4e2a\u6708\u540e\u8fd9\u4e9b\u8bdd\u9898\u5f00\u59cb\u6d41 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u5efa\u7acb\u4e86\u4e00\u4e2a\u80fd\u591f\u641c\u7d22rebuild-fm\u7684shownote\u7684\u670d\u52a1\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-08-10T06:59:21+00:00","article_modified_time":"2024-04-29T20:24:15+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d427d37434c4406c995aa\/36-0.png"}],"author":"\u65b0, \u97f5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u65b0, \u97f5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"3 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%bb%ba%e7%ab%8b%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%bd%e5%a4%9f%e6%90%9c%e7%b4%a2rebuild-fm%e7%9a%84shownote%e7%9a%84%e6%9c%8d%e5%8a%a1%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%bb%ba%e7%ab%8b%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%bd%e5%a4%9f%e6%90%9c%e7%b4%a2rebuild-fm%e7%9a%84shownote%e7%9a%84%e6%9c%8d%e5%8a%a1%e3%80%82\/","name":"\u6211\u5efa\u7acb\u4e86\u4e00\u4e2a\u80fd\u591f\u641c\u7d22Rebuild.fm\u7684Shownote\u7684\u670d\u52a1 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-08-10T06:59:21+00:00","dateModified":"2024-04-29T20:24:15+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%bb%ba%e7%ab%8b%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%bd%e5%a4%9f%e6%90%9c%e7%b4%a2rebuild-fm%e7%9a%84shownote%e7%9a%84%e6%9c%8d%e5%8a%a1%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%bb%ba%e7%ab%8b%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%bd%e5%a4%9f%e6%90%9c%e7%b4%a2rebuild-fm%e7%9a%84shownote%e7%9a%84%e6%9c%8d%e5%8a%a1%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%bb%ba%e7%ab%8b%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%bd%e5%a4%9f%e6%90%9c%e7%b4%a2rebuild-fm%e7%9a%84shownote%e7%9a%84%e6%9c%8d%e5%8a%a1%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u6211\u5efa\u7acb\u4e86\u4e00\u4e2a\u80fd\u591f\u641c\u7d22Rebuild.fm\u7684Shownote\u7684\u670d\u52a1"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9","name":"\u65b0, \u97f5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","caption":"\u65b0, \u97f5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%bb%ba%e7%ab%8b%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%bd%e5%a4%9f%e6%90%9c%e7%b4%a2rebuild-fm%e7%9a%84shownote%e7%9a%84%e6%9c%8d%e5%8a%a1%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40691","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=40691"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40691\/revisions"}],"predecessor-version":[{"id":89660,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40691\/revisions\/89660"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=40691"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=40691"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=40691"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}