<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>citysheep (Rui)</title>
    <link>https://ruby-china.org/citysheep</link>
    <description>技术、产品、Growth Hacking</description>
    <language>en-us</language>
    <item>
      <title>[厦门] T 社招聘初级开发工程师</title>
      <description>&lt;h2 id="关于T社"&gt;关于 T 社&lt;/h2&gt;
&lt;p&gt;从刚开始作为工人、水手的工作服，T 恤因其舒适、透气、吸汗而受到人们欢迎。一部《欲望号街车》，让 T 恤走进了公众视野，随后逐渐风靡全球。&lt;/p&gt;

&lt;p&gt;T 社是一个创想至上的 T 恤定制与预售平台，让热爱 T 恤的 T 迷们用自己的表达方式涂绘在 T 恤上面，做自己所爱，把喜欢穿在身上，把喜欢分享出去。T 社平台从生产、配送及管理，帮助发起者实现无库存销售，让 T 恤定制变得更简单！&lt;/p&gt;

&lt;p&gt;目前公司近 50 人，包括 3 位创始人：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CEO，拥有丰富的人生阅历，辗转四国求学，适应力极强，吹过太平洋的风，踏过下雪的美国，混过大名鼎鼎的剑桥。归国后曾任顶级 VC 投资人，观察敏锐，经验老道，积累丰厚的互联网资源后，开始自己动手丰衣足食的创业生涯。心地善良的暖男 CEO，主要给 T 社的小伙伴们做除了技术以外的任何活儿。&lt;/li&gt;
&lt;li&gt;CTO，前 IDG 自由人（青年驻场企业家），大学拿遍各种奖学金并环游世界，折腾 Facebook App 做到百万用户，热爱从零到一创造价值的感觉。毕业后加入外资投行开发顶级算法交易，业余时间不忘搭建各种产品，坚信技术改变世界。&lt;/li&gt;
&lt;li&gt;CSCO（供应链合伙人），国际贸易科班毕业，传统行业游侠，项目遍及服装、矿产、农产品、食品原材料及加工等，并对进出口和贸易、金融多有涉足。家族 20 年经营服饰面料，与几十家国内外品牌合作密切，品牌供应商资源硬朗。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="初级开发工程师"&gt;初级开发工程师&lt;/h2&gt;
&lt;p&gt;要求&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;熟悉 Ruby 或者 Nodejs，有良好的编程功底（有 Java / Python / PHP 经验，对 Ruby / Nodejs 感兴趣亦可以）&lt;/li&gt;
&lt;li&gt;熟练使用关系型数据库，如 MySQL、Postgresql 等&lt;/li&gt;
&lt;li&gt;了解和使用过自动化测试&lt;/li&gt;
&lt;li&gt;熟悉 Linux / Unix 命令行&lt;/li&gt;
&lt;li&gt;有极客精神，热爱编程，对自己的代码有追求&lt;/li&gt;
&lt;li&gt;看英文文档学新技术无压力&lt;/li&gt;
&lt;li&gt;熟悉 git 的操作&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;加分&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;在线作品、博客，或开源项目开发经验&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="公司福利"&gt;公司福利&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;有竞争力的薪资（应届生 4~5K，具体看实际经验和能力）&lt;/li&gt;
&lt;li&gt;13 薪，培训福利，浮动年终奖&lt;/li&gt;
&lt;li&gt;早期员工，不错的期权激励&lt;/li&gt;
&lt;li&gt;午餐、晚餐补贴&lt;/li&gt;
&lt;li&gt;完善的薪酬体系，每年的薪资晋级和职位提升机会&lt;/li&gt;
&lt;li&gt;良好的工作环境，免费零食饮料，更有下午茶、T 社欢乐趴等活动&lt;/li&gt;
&lt;li&gt;满一年享受 5 天年假，年假假期将逐年增加&lt;/li&gt;
&lt;li&gt;弹性上班时间，09:00 – 10:00 为上班时间，下班时间为 18:00 – 19:00&lt;/li&gt;
&lt;li&gt;生日红包、大乐透及生日蛋糕让你的生日不再寂寞&lt;/li&gt;
&lt;li&gt;不定期组织员工旅游、户外休闲等活动，外出旅行、真人 CS、别墅派对等&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="技术栈"&gt;技术栈&lt;/h2&gt;
&lt;p&gt;T 社技术团队均来自国内外顶尖学府及互联网公司，我们玩技术、爱技术、不妥协。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;后端：Nodejs/Ruby On Rails + Docker&lt;/li&gt;
&lt;li&gt;前端：React + Redux, Vue，Nodejs, Webpack&lt;/li&gt;
&lt;li&gt;移动：React Native&lt;/li&gt;
&lt;li&gt;Code Review、持续集成、持续部署和自动化测试，Github + Jenkins CI + Slack + Lint&lt;/li&gt;
&lt;li&gt;队内技术分享，定期的大牛分享&lt;/li&gt;
&lt;li&gt;喜欢技术挑战&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="新闻报道"&gt;新闻报道&lt;/h2&gt;
&lt;p&gt;T 社是技术圈的好伙伴。Vue.js、Strikingly、稀土掘金、SegmentFault 等都是我们的合作伙伴。今年 T 社更是中国 RubyConf、JSConf 独家 T 恤提供方。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;公司官网： &lt;a href="https://www.tshe.com" rel="nofollow" target="_blank"&gt;https://www.tshe.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;品牌视频： &lt;a href="http://v.qq.com/boke/page/z/0/3/z0175jum2d3.html" rel="nofollow" target="_blank"&gt;http://v.qq.com/boke/page/z/0/3/z0175jum2d3.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;36kr 报道： &lt;a href="http://36kr.com/p/5040894.html?ref=head_line_top" rel="nofollow" target="_blank"&gt;http://36kr.com/p/5040894.html?ref=head_line_top&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;铅笔道报道： &lt;a href="http://qianbidao.baijia.baidu.com/article/260835" rel="nofollow" target="_blank"&gt;http://qianbidao.baijia.baidu.com/article/260835&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;小饭桌报道： &lt;a href="http://it.sohu.com/20160106/n433637711.shtml" rel="nofollow" target="_blank"&gt;http://it.sohu.com/20160106/n433637711.shtml&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;创业邦报道： &lt;a href="http://www.cyzone.cn/a/20160121/289004.html" rel="nofollow" target="_blank"&gt;http://www.cyzone.cn/a/20160121/289004.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;T-Show ： &lt;a href="https://www.tshe.com/stories" rel="nofollow" target="_blank"&gt;https://www.tshe.com/stories&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="联系我们"&gt;联系我们&lt;/h2&gt;
&lt;p&gt;如果你对 T 社感兴趣，欢迎发送简历到 hi@tshe.com。&lt;/p&gt;</description>
      <author>citysheep</author>
      <pubDate>Fri, 23 Sep 2016 15:19:05 +0800</pubDate>
      <link>https://ruby-china.org/topics/31148</link>
      <guid>https://ruby-china.org/topics/31148</guid>
    </item>
    <item>
      <title>[厦门] T 社招聘实习开发工程师</title>
      <description>&lt;p&gt;T 社是一个 T 恤定制、众筹的互联网初创公司，已获得 IDG 资本和 FreeS 峰瑞资本的天使轮投资。目前需要招聘实习开发工程师。这是我们的网站： &lt;a href="https://www.tshe.com" rel="nofollow" target="_blank"&gt;https://www.tshe.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;目前公司近 50 人，包括 3 位创始人：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CEO - 拥有丰富的人生阅历，辗转四国求学，适应力极强，吹过太平洋的风，踏过下雪的美国，混过大名鼎鼎的剑桥。归国后曾任顶级 VC 投资人，观察敏锐，经验老道，积累丰厚的互联网资源后，开始自己动手丰衣足食的创业生涯。心地善良的暖男 CEO，主要给 T 社的小伙伴们做除了技术以外的任何活儿。&lt;/li&gt;
&lt;li&gt;CTO - 前 IDG 自由人（青年驻场企业家），大学拿遍了奖学金并环游世界，折腾 Facebook App 做到百万用户，热爱从零到一创造价值的感觉。毕业后加入外资投行开发顶级算法交易，业余时间不忘搭建各种产品，坚信技术改变世界。&lt;/li&gt;
&lt;li&gt;供应链合伙人 - 国际贸易科班毕业，传统行业游侠，项目遍及服装、矿产、农产品、食品原材料及加工等，并对进出口和贸易、金融多有涉足。家族 20 年经营服饰面料，与几十家国内外品牌合作密切，品牌供应商资源硬朗。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="团队福利"&gt;团队福利&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;厦门本地有竞争力的薪酬水平（实习 2~3k）&lt;/li&gt;
&lt;li&gt;队内技术分享，定期的大牛分享（覃超是我们的技术顾问：&lt;a href="https://www.zhihu.com/people/qin.chao" rel="nofollow" target="_blank"&gt;https://www.zhihu.com/people/qin.chao&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;免费午饭和晚饭&lt;/li&gt;
&lt;li&gt;无限量的零食和饮料&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="技术栈"&gt;技术栈&lt;/h2&gt;
&lt;p&gt;T 社技术团队均来自国内外顶尖学府及互联网公司，我们玩技术、爱技术、不妥协。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;后端：Rails/Node + Docker&lt;/li&gt;
&lt;li&gt;前端：Webpack, React + Redux, Vue&lt;/li&gt;
&lt;li&gt;移动：React Native&lt;/li&gt;
&lt;li&gt;Code Review、持续集成、持续部署和自动化测试（Github + Jenkins CI + Slack）&lt;/li&gt;
&lt;li&gt;喜欢技术挑战&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果你感兴趣，欢迎发送简历到 hi@tshe.com，请注明简历来自 RubyChina。&lt;/p&gt;
&lt;h2 id="新闻报道"&gt;新闻报道&lt;/h2&gt;
&lt;p&gt;T 社是技术圈的好伙伴。Vue.js、Strikingly、稀土掘金、SegmentFault 等都是我们的合作伙伴。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;公司官网： &lt;a href="https://www.tshe.com" rel="nofollow" target="_blank"&gt;https://www.tshe.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;酷炫视频： &lt;a href="http://v.qq.com/boke/page/z/0/3/z0175jum2d3.html" rel="nofollow" target="_blank"&gt;http://v.qq.com/boke/page/z/0/3/z0175jum2d3.html&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;36kr 报道： &lt;a href="http://36kr.com/p/5040894.html?ref=head_line_top" rel="nofollow" target="_blank"&gt;http://36kr.com/p/5040894.html?ref=head_line_top&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;铅笔道报道： &lt;a href="http://qianbidao.baijia.baidu.com/article/260835" rel="nofollow" target="_blank"&gt;http://qianbidao.baijia.baidu.com/article/260835&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;小饭桌报道： &lt;a href="http://it.sohu.com/20160106/n433637711.shtml" rel="nofollow" target="_blank"&gt;http://it.sohu.com/20160106/n433637711.shtml&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;创业邦报道：&lt;a href="http://www.cyzone.cn/a/20160121/289004.html" rel="nofollow" target="_blank"&gt;http://www.cyzone.cn/a/20160121/289004.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;T-Show：&lt;a href="https://www.tshe.com/stories" rel="nofollow" target="_blank"&gt;https://www.tshe.com/stories&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="附我司技术小哥之日常"&gt;附我司技术小哥之日常&lt;/h2&gt;&lt;h4 id="开开生日party"&gt;开开生日 party&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/740e7b0e8f9430fa8b8c969f86b1429c.jpg" title="" alt=""&gt;&lt;/p&gt;
&lt;h4 id="结对写写代码"&gt;结对写写代码&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/f85f8152a0f6c0ddd5dbd75e5683e11b.jpg" title="" alt=""&gt;&lt;/p&gt;
&lt;h4 id="踢踢桌上足球"&gt;踢踢桌上足球&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/82f8a123084df608d4d09d224459f2b5.jpg" title="" alt=""&gt;&lt;/p&gt;
&lt;h4 id="和设计师相爱想杀"&gt;和设计师相爱想杀&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/4266c5cfd2082a30cb19322ea00a50ce.jpg" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>citysheep</author>
      <pubDate>Sun, 17 Apr 2016 12:50:04 +0800</pubDate>
      <link>https://ruby-china.org/topics/29749</link>
      <guid>https://ruby-china.org/topics/29749</guid>
    </item>
    <item>
      <title>Rails 配置 �Webpack 终极篇</title>
      <description>&lt;p&gt;之前写过一篇 webpack 初步 &lt;a href="https://ruby-china.org/topics/27537" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics/27537&lt;/a&gt;，后来随着深入使用做了一些修改和优化。这篇文章将更详细地介绍如何从 Rails Asset Pipeline 迁移到 webpack（包括 javascript、stylesheets 以及其他资源文件），并且在生产环境使用。&lt;/p&gt;
&lt;h4 id="为什么不继续使用 Asset Pipeline"&gt;为什么不继续使用 Asset Pipeline&lt;/h4&gt;
&lt;p&gt;Rails Asset Pipeline 是个很不错的解决方案，如果前端代码不复杂的话还是非常推荐的。然而如果一个项目有如下的特征，建议还是使用 npm 来管理前端的 package，并用 webpack 或者其他工具来做前端工程化：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;使用了最新的一些前端 package，找不到对应的 gem，需要人工添加到 vendor。&lt;/li&gt;
&lt;li&gt;前端有复杂的结构和交互，需要更清晰地管理不同组件的倚赖。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="STEP 1：安装 npm 和 webpack"&gt;STEP 1：安装 npm 和 webpack&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;使用 nvm 安装 npm（和咱 Ruby 的 rvm 基本一样）&lt;/li&gt;
&lt;li&gt;在 Rails 项目的目录下运行 &lt;code&gt;npm init&lt;/code&gt;，按提示操作，会自动创建一个 &lt;code&gt;package.json&lt;/code&gt; 文件&lt;/li&gt;
&lt;li&gt;接着通过 npm 安装我们需要的 package，比如 webpack：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// 安装 webpack
npm install webpack --save-dev 

// webpack 命令行
npm install -g webpack 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;######注意：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;npm install XXX --save-dev&lt;/code&gt; 和 &lt;code&gt;npm install XXX -save&lt;/code&gt; 会自动把要安装的 package 添加到 &lt;code&gt;package.json&lt;/code&gt; 文件里的  dependencies 和 devDependencies 部分。&lt;/li&gt;
&lt;li&gt;npm 国内可能比较慢，建议使用 cnpm：&lt;a href="http://npm.taobao.org/" rel="nofollow" target="_blank"&gt;http://npm.taobao.org/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;最终你的 package.json 文件差不多长这样，有一些 package 我们之后会提到。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "my app",
  "description": "my rails app using webpack",
  "version": "1.0.0",
  "dependencies": {
    "jquery": "^2.1.4",
    "jquery-ujs": "~1.1.0-1",
    "lodash": "~3.0.0",
  },
  "devDependencies": {
    "babel-core": "^5.8.25",
    "babel-loader": "^5.3.2",
    "babel-runtime": "^6.5.0",
    "coffee-loader": "^0.7.2",
    "coffee-script": "^1.10.0",
    "css-loader": "^0.23.0",
    "exports-loader": "~0.6.2",
    "expose-loader": "~0.6.0",
    "extract-text-webpack-plugin": "^0.9.1",
    "file-loader": "^0.8.5",
    "imports-loader": "~0.6.3",
    "node-sass": "^3.4.2",
    "sass-loader": "^3.1.2",
    "style-loader": "^0.13.0",
    "url-loader": "^0.5.7",
    "webpack": "^1.12.14",
    "webpack-manifest-plugin": "^1.0.0"
  }
}

&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="STEP 2：搬迁前端代码"&gt;STEP 2：搬迁前端代码&lt;/h4&gt;&lt;h5 id="代码结构"&gt;代码结构&lt;/h5&gt;
&lt;p&gt;现在我们考虑把前端的 javascript、stylesheets、images 都抽出来，在原项目目录下创建一个新文件夹 &lt;code&gt;frontend&lt;/code&gt;，项目文件夹结构如下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/app
   /assets
   /controllers
   /models
   /...
/config
   /...    
/frontend
   /fonts
   /images
   /stylesheets
   /javascripts
   /development.config.js
   /production.config.js

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在我们添加一些 javascript、stylesheet 和 image：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/frontend
   /fonts
   /images
       /banner.jpg
   /stylesheets
       /home.scss
   /javascripts
       /home.coffee
       /app.js
   /development.config.js
   /production.config.js
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id="配置 webpack"&gt;配置 webpack&lt;/h5&gt;
&lt;p&gt;webpack 的配置文件一如既往的复杂，&lt;code&gt;development.config.js&lt;/code&gt; 是开发环境的配置，加了一些注释，就不赘述了：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lodash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;webpack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;webpack&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;assetPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;assets&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;ExtractTextPlugin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;extract-text-webpack-plugin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;ManifestPlugin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;webpack-manifest-plugin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

  &lt;span class="c1"&gt;// 告诉 webpack 去哪里找 entry 文件&lt;/span&gt;
  &lt;span class="c1"&gt;// webpack 按需加载和打包里面使用的 module，这里用 CommonJS/AMD/ES6 的语法都可以&lt;/span&gt;
  &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./frontend/javascripts/app.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="c1"&gt;// 开发环境 debug 的一些配置&lt;/span&gt;
  &lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;displayErrorDetails&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;outputPathinfo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;devtool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cheap-module-eval-source-map&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;assetPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="c1"&gt;// 打包出来的文件会是 [文件名]_bundle.js&lt;/span&gt;
  &lt;span class="c1"&gt;// 比如我们的 entry 叫 app.js，打包出来的文件就是 app_bundle.js&lt;/span&gt;
  &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[name]_bundle.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;publicPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/assets/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.coffee&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;modulesDirectories&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node_modules&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;plugins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="c1"&gt;// 如果多个文件里使用了 jquery，以下这个 plugin 可以让你不用每次都 require('jquery')&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ProvidePlugin&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;$&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jquery&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jquery&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;

  &lt;span class="c1"&gt;// 用来抽取 js 文件里引用的 css 文件，最终的文件名也会是 [js文件名]_bundle.css 的形式&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ExtractTextPlugin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[name]_bundle.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;allChunks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;// webpack 强大的 loader&lt;/span&gt;
&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;loaders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;// 下面两行将 jquery 暴露到外面的 $ 和 jQuery 里，这样 webpack 以外的 js 也可以顺利使用 jquery&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jquery&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;expose?jQuery&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jquery&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;expose?$&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="c1"&gt;// 使用 babel-loader 来支持 es6 语法&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;js$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;babel-loader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="c1"&gt;// 使用 coffee-loader 来编译 CoffeeScript&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;coffee$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;coffee-loader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="c1"&gt;// 使用 url-loader 来编译字体文件和图片，如果文件小于8kb就直接变成 DataUrl&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.(&lt;/span&gt;&lt;span class="sr"&gt;woff|woff2|eot|ttf|otf&lt;/span&gt;&lt;span class="se"&gt;)\??&lt;/span&gt;&lt;span class="sr"&gt;.*$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;url-loader?limit=8192&amp;amp;name=[name].[ext]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.(&lt;/span&gt;&lt;span class="sr"&gt;jpe&lt;/span&gt;&lt;span class="se"&gt;?&lt;/span&gt;&lt;span class="sr"&gt;g|png|gif|svg&lt;/span&gt;&lt;span class="se"&gt;)\??&lt;/span&gt;&lt;span class="sr"&gt;.*$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;url-loader?limit=8192&amp;amp;name=[name].[ext]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="c1"&gt;// 使用 style-loader、css-loader 来打包 css，sass-loader 打包 sass&lt;/span&gt;
    &lt;span class="c1"&gt;// 使用 ExtractTextPLugin 生成独立的 css 文件&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;css$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ExtractTextPlugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;style-loader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;css-loader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;scss$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ExtractTextPlugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;style&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;css!sass&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样就可以在 js 里引用其他 js/coffee、css/sass 啦，例如我们的 &lt;code&gt;app.js&lt;/code&gt; 里可以这样写：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 引用 home.scss&lt;/span&gt;
&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../stylesheets/home.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 引用 home.coffee&lt;/span&gt;
&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./home&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以在 css/sass 里引用 image 了，注意使用 &lt;code&gt;url&lt;/code&gt; 方法（类似 Rails 里的 &lt;code&gt;asset-url&lt;/code&gt;）。例如我们的 &lt;code&gt;home.scss&lt;/code&gt;：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.home-banner&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sx"&gt;url('../images/banner.jpg')&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="生产环境"&gt;生产环境&lt;/h4&gt;
&lt;p&gt;生产环境的话需要做一些调整：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;打包出来的资源名称加 hash（类似 Rails 里的 fingerprint）&lt;/li&gt;
&lt;li&gt;使用 CDN&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&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 加 fingerprint&lt;/span&gt;
  &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[name]_bundle-[chunkhash].js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="c1"&gt;// 假设我们的 cdn 是 http://cdn.test.com&lt;/span&gt;
  &lt;span class="na"&gt;publicPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://cdn7.test.com/assets/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;plugins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="c1"&gt;// 给抽出来的 css 加 fingerprint&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ExtractTextPlugin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[name]_bundle-[chunkhash].css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;allChunks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;

    &lt;span class="c1"&gt;// 这个 pulgin 我们下一步介绍&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ManifestPlugin&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;webpack_manifest.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;

    &lt;span class="c1"&gt;// 一些生产环境优化用的 plugin&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;optimize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;UglifyJsPlugin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;optimize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OccurenceOrderPlugin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;loaders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
     &lt;span class="p"&gt;...&lt;/span&gt;
     &lt;span class="c1"&gt;// 给 image、font 等资源加 fingerprint&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.(&lt;/span&gt;&lt;span class="sr"&gt;woff|woff2|eot|ttf|otf&lt;/span&gt;&lt;span class="se"&gt;)\??&lt;/span&gt;&lt;span class="sr"&gt;.*$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;url-loader?limit=8192&amp;amp;name=[name]-[hash].[ext]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.(&lt;/span&gt;&lt;span class="sr"&gt;jpe&lt;/span&gt;&lt;span class="se"&gt;?&lt;/span&gt;&lt;span class="sr"&gt;g|png|gif|svg&lt;/span&gt;&lt;span class="se"&gt;)\??&lt;/span&gt;&lt;span class="sr"&gt;.*$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;url-loader?limit=8192&amp;amp;name=[name]-[hash].[ext]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
     &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="运行 webpack"&gt;运行 webpack&lt;/h4&gt;
&lt;p&gt;开发环境运行下面的命令，webpack 会根据配置文件打包资源。按之前的例子，就会在 &lt;code&gt;assets/public&lt;/code&gt; 里打包出 &lt;code&gt;app_bundle.js&lt;/code&gt; &lt;code&gt;app_bundle.css&lt;/code&gt; &lt;code&gt;banner.jpg&lt;/code&gt; 并随时更新：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;webpack --config frontend/development.config.js --display-reasons --display-chunks --progress --color
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;生产环境使用以下命令：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;webpack --config frontend/production.config.js -p
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="STEP3：Rails 后端"&gt;STEP3：Rails 后端&lt;/h3&gt;
&lt;p&gt;webpack 打包完成后，在 Rails 里如何引用打包生成的资源呢？在开发环境可以直接使用文件名引入：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;%= javascript_include_tag 'app_bundle' %&amp;gt;
&amp;lt;%= stylesheet_link_tag 'app_bundle' %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是生产环境打包出来资源的名称加了 fingerprint，导致 Rails 找不到资源。这时候我们使用 webpack 的 &lt;code&gt;ManifestPlugin&lt;/code&gt;，它会在打包的时候生成一个 json 文件，里面有原文件和生成文件的对应关系。例如：&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"banner.jpg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"banner-51aad7eb9e12db5cd6b1fd8688aadc8a.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"app.css"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"app_bundle-d5c3643adae965258b70.css"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"app.js"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"app_bundle-d5c3643adae965258b70.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 webpack 里配置如下：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ManifestPlugin&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;webpack_manifest.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样在 Rails 里我们可以依据这个 json 文件来写一些 helper，让 Rails 找到 webpack 打包出来的资源：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rb&lt;/span&gt; &lt;span class="n"&gt;里添加配置&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;webpack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="ss"&gt;asset_manifest: &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="n"&gt;加一个&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;initializers&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;webpack&lt;/span&gt; &lt;span class="n"&gt;来加载这个配置&lt;/span&gt;
&lt;span class="n"&gt;asset_manifest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'public'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'assets'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'webpack_manifest.json'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exist?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;asset_manifest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:manifest&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;asset_manifest&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;with_indifferent_access&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;application_helper.rb&lt;/code&gt; 里添加加载 webpack 资源的 helper 方法：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="n"&gt;cdn_assets_url&lt;/span&gt; &lt;span class="n"&gt;是我们自定义的一个方法&lt;/span&gt;
&lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="n"&gt;如果是生产环境会返回该资源在我们自己&lt;/span&gt; &lt;span class="n"&gt;cdn&lt;/span&gt; &lt;span class="n"&gt;的&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;
&lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="n"&gt;如果是开发环境直接返回本地的&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;webpack_javascript_include_tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;full_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_bundle.js"&lt;/span&gt;
  &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cnd_assets_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/assets/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;full_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:manifest&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;asset_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:manifest&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;asset_name&lt;/span&gt;
      &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cnd_assets_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/assets/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;asset_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="s2"&gt;"&amp;lt;script src=&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;&amp;lt;/script&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;html_safe&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;webpack_stylesheet_link_tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;full_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_bundle.css"&lt;/span&gt;
  &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cnd_assets_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/assets/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;full_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:manifest&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;asset_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:manifest&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.css"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;asset_name&lt;/span&gt;
      &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cnd_assets_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/assets/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;asset_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="s2"&gt;"&amp;lt;link rel=&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;stylesheet&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; href=&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;html_safe&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样我们只需要用以上两个方法在 Rails 的 view 层引用资源就可以了。比如我们之前的例子里的 &lt;code&gt;app_bundle.js&lt;/code&gt; 和  &lt;code&gt;app_bundle.css&lt;/code&gt;：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= webpack_javascript_include_tag 'app' %&amp;gt;
&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;webpack_stylesheet_link_tag&lt;/span&gt; &lt;span class="s1"&gt;'app'&lt;/span&gt; &lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="其他功能"&gt;其他功能&lt;/h4&gt;&lt;h5 id="Hot Module Replacement"&gt;Hot Module Replacement&lt;/h5&gt;
&lt;p&gt;如果使用了 React，可以在开发环境配合 webpack 实现热替换（HMR）。需要先安装一个 &lt;code&gt;webpack-dev-server&lt;/code&gt;，它会默认运行在 8080 端口，然后实时根据代码改动打包更新 webpack 资源，并在浏览器更新 React 组件，而不需要刷新页面。&lt;/p&gt;

&lt;p&gt;这么强大的功能如何使用？我们先在 webpack 配置里修改 publicPath：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;   
  &lt;span class="na"&gt;publicPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:8080/assets/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加 &lt;code&gt;react-hot-loader&lt;/code&gt; 来编译 js：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;js$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;loaders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-hot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;babel-loader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用以下命令打包：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;webpack-dev-server --config frontend/development.config.js --hot --inline
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 Rails 里将我们之前写的两个 helper 方法再进一步改进就可以了：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;webpack_javascript_include_tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;full_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_bundle.js"&lt;/span&gt;
  &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cnd_assets_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/assets/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;full_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;development?&lt;/span&gt;
    &lt;span class="c1"&gt;# 热替换&lt;/span&gt;
    &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"http://localhost:8080/assets/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;full_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;elsif&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:manifest&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;asset_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:manifest&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;asset_name&lt;/span&gt;
      &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cnd_assets_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/assets/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;asset_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="s2"&gt;"&amp;lt;script src=&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;&amp;lt;/script&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;html_safe&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;webpack_stylesheet_link_tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;full_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_bundle.css"&lt;/span&gt;
  &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cnd_assets_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/assets/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;full_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;development?&lt;/span&gt;
    &lt;span class="c1"&gt;# 热替换&lt;/span&gt;
    &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"http://localhost:8080/assets/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;full_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;elsif&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:manifest&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;asset_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:manifest&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.css"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;asset_name&lt;/span&gt;
      &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cnd_assets_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/assets/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;asset_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="s2"&gt;"&amp;lt;link rel=&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;stylesheet&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; href=&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;html_safe&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id="webpack 性能调优"&gt;webpack 性能调优&lt;/h5&gt;
&lt;p&gt;webpack 性能优化可以参考这篇文章 &lt;a href="https://github.com/wyvernnot/webpack_performance/tree/master/moment-example" rel="nofollow" target="_blank"&gt;https://github.com/wyvernnot/webpack_performance/tree/master/moment-example&lt;/a&gt;。可通过添加别名、使用 cdn 来优化性能，这里就不一一列举了。建议先用 webpack 自带的 profile 方法分析出哪里是瓶颈后再调优。&lt;/p&gt;
&lt;h4 id="后记"&gt;后记&lt;/h4&gt;
&lt;p&gt;Rails 完成了 webpack 的配置之后，前端完全融入了现在的前端生态，之后可以玩的就多了。比如最近我们在用 React + Redux 重构 T 社的编辑器（&lt;a href="http://tshe.com/campaigns/new" rel="nofollow" target="_blank"&gt;http://tshe.com/campaigns/new&lt;/a&gt;）就非常方便 :)&lt;/p&gt;</description>
      <author>citysheep</author>
      <pubDate>Fri, 08 Apr 2016 13:20:13 +0800</pubDate>
      <link>https://ruby-china.org/topics/29630</link>
      <guid>https://ruby-china.org/topics/29630</guid>
    </item>
    <item>
      <title>[厦门] T 社招聘 Ruby 工程师等职位啦</title>
      <description>&lt;p&gt;T 社是一个 T 恤定制、众筹的互联网初创公司，已获得 IDG 资本和 FreeS 峰瑞资本的天使轮投资。目前在厦门扩张团队，需要招聘 Ruby/Nodejs 全栈工程师、web 前端工程师、移动开发工程师。作为早期团队成员，除了诱人的薪资、福利和感受从零到一打造产品的快感外，还将获得丰厚的期权奖励。这是我们的网站： &lt;a href="http://tshe.com" rel="nofollow" target="_blank"&gt;http://tshe.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;目前团队全职的有 31 人，包括 3 位创始人：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CEO - 前 IDG 投资人，美国 UIUC 本科，英国剑桥硕士，拥有丰富的投资圈背景和投融资经验，认识国内很多著名投资人和创业团队。&lt;/li&gt;
&lt;li&gt;CTO - 香港中文大学全额奖学金获得者，开发过百万用户的 Facebook App，外资投行顶级交易系统开发主力，前 IDG 自由人。&lt;/li&gt;
&lt;li&gt;供应链合伙人 - 在福建的家族服装企业，拥有强大的供应链优势，和许多国内知名品牌有合作关系。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="团队福利"&gt;团队福利&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;有竞争力的薪酬水平（5~10k）&lt;/li&gt;
&lt;li&gt;早期员工，期权激励&lt;/li&gt;
&lt;li&gt;队内技术分享，定期的大牛分享&lt;/li&gt;
&lt;li&gt;免费午饭和晚饭&lt;/li&gt;
&lt;li&gt;无限量的零食和饮料&lt;/li&gt;
&lt;li&gt;五险一金&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="我们对技术有着执着的追求："&gt;我们对技术有着执着的追求：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;后端：Rails/Node + Docker&lt;/li&gt;
&lt;li&gt;前端：Webpack, React + Redux, Vue&lt;/li&gt;
&lt;li&gt;移动：React Native&lt;/li&gt;
&lt;li&gt;Code Review、持续集成、持续部署和自动化测试&lt;/li&gt;
&lt;li&gt;喜欢技术挑战&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果你感兴趣，欢迎发送简历到 hi@tshe.com。也欢迎推荐靠谱的朋友，如推荐成功，我们将送上 Apple Watch。也欢迎来我们平台定制 T 恤、卫衣 :)&lt;/p&gt;
&lt;h2 id="新闻报道"&gt;新闻报道&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;公司官网： &lt;a href="http://tshe.me" rel="nofollow" target="_blank"&gt;http://tshe.me&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;酷炫视频： &lt;a href="http://v.qq.com/boke/page/z/0/3/z0175jum2d3.html" rel="nofollow" target="_blank"&gt;http://v.qq.com/boke/page/z/0/3/z0175jum2d3.html&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;36kr 报道： &lt;a href="http://36kr.com/p/5040894.html?ref=head_line_top" rel="nofollow" target="_blank"&gt;http://36kr.com/p/5040894.html?ref=head_line_top&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;铅笔道报道： &lt;a href="http://qianbidao.baijia.baidu.com/article/260835" rel="nofollow" target="_blank"&gt;http://qianbidao.baijia.baidu.com/article/260835&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;小饭桌报道： &lt;a href="http://it.sohu.com/20160106/n433637711.shtml" rel="nofollow" target="_blank"&gt;http://it.sohu.com/20160106/n433637711.shtml&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;创业邦报道：&lt;a href="http://www.cyzone.cn/a/20160121/289004.html" rel="nofollow" target="_blank"&gt;http://www.cyzone.cn/a/20160121/289004.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="附我司技术小哥之日常"&gt;附我司技术小哥之日常&lt;/h2&gt;&lt;h4 id="开开生日party"&gt;开开生日 party&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/740e7b0e8f9430fa8b8c969f86b1429c.jpg" title="" alt=""&gt;&lt;/p&gt;
&lt;h4 id="结对写写代码"&gt;结对写写代码&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/f85f8152a0f6c0ddd5dbd75e5683e11b.jpg" title="" alt=""&gt;&lt;/p&gt;
&lt;h4 id="踢踢桌上足球"&gt;踢踢桌上足球&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/82f8a123084df608d4d09d224459f2b5.jpg" title="" alt=""&gt;&lt;/p&gt;
&lt;h4 id="和设计师相爱想杀"&gt;和设计师相爱想杀&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/4266c5cfd2082a30cb19322ea00a50ce.jpg" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>citysheep</author>
      <pubDate>Sat, 23 Jan 2016 00:00:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/28828</link>
      <guid>https://ruby-china.org/topics/28828</guid>
    </item>
    <item>
      <title>[厦门] 获得 IDG 和 FreeS 投资的初创团队招聘 Ruby 全栈工程师</title>
      <description>&lt;p&gt;T 社是一个 T 恤定制、众筹的互联网初创公司，已获得 IDG 资本和 FreeS 峰瑞资本的天使轮投资。目前在厦门扩张团队，需要招聘 Ruby/Nodejs 全栈工程师、web 前端工程师。作为早期团队成员，除了诱人的薪资、福利和感受从零到一打造产品的快感外，还将获得丰厚的期权奖励。这是我们的网站： &lt;a href="http://tshe.com" rel="nofollow" target="_blank"&gt;http://tshe.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;目前团队全职的有 31 人，包括 3 位创始人：
CEO - 前 IDG 投资人，美国 UIUC 本科，英国剑桥硕士，拥有丰富的投资圈背景和投融资经验，认识国内很多著名投资人和创业团队。
CTO - 香港中文大学全额奖学金获得者，开发过百万用户的 Facebook App，外资投行顶级交易系统开发主力，前 IDG 自由人。
供应链合伙人 - 在福建的家族服装企业，拥有强大的供应链优势，和许多国内知名品牌有合作关系。&lt;/p&gt;

&lt;p&gt;团队福利
有竞争力的薪酬水平
早期员工，期权激励
队内技术分享，强大的顾问团队：&lt;a href="http://tshe.com/about_us" rel="nofollow" target="_blank"&gt;http://tshe.com/about_us&lt;/a&gt;
免费午饭和晚饭
无限量的零食和饮料
五险一金&lt;/p&gt;

&lt;p&gt;我们对技术有着执着的追求：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;后端：Rails/Nodejs&lt;/li&gt;
&lt;li&gt;前端：webpack + React + Redux&lt;/li&gt;
&lt;li&gt;移动：React Native&lt;/li&gt;
&lt;li&gt;Code Review、持续集成、持续部署和自动化测试&lt;/li&gt;
&lt;li&gt;喜欢技术挑战&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果你感兴趣，欢迎发送简历到 hi@tshe.com。也欢迎推荐靠谱的朋友，如推荐成功，我们将送上 Apple Watch。也欢迎来我们平台定制 T 恤、卫衣 :)&lt;/p&gt;

&lt;p&gt;新闻报道&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;公司官网： &lt;a href="http://tshe.com" rel="nofollow" target="_blank"&gt;http://tshe.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;酷炫视频： &lt;a href="http://v.qq.com/boke/page/z/0/3/z0175jum2d3.html" rel="nofollow" target="_blank"&gt;http://v.qq.com/boke/page/z/0/3/z0175jum2d3.html&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;36kr 报道： &lt;a href="http://36kr.com/p/5040894.html?ref=head_line_top" rel="nofollow" target="_blank"&gt;http://36kr.com/p/5040894.html?ref=head_line_top&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;铅笔道报道： &lt;a href="http://qianbidao.baijia.baidu.com/article/260835" rel="nofollow" target="_blank"&gt;http://qianbidao.baijia.baidu.com/article/260835&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;小饭桌报道： &lt;a href="http://it.sohu.com/20160106/n433637711.shtml" rel="nofollow" target="_blank"&gt;http://it.sohu.com/20160106/n433637711.shtml&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;创业邦报道：&lt;a href="http://www.cyzone.cn/a/20160121/289004.html" rel="nofollow" target="_blank"&gt;http://www.cyzone.cn/a/20160121/289004.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>citysheep</author>
      <pubDate>Wed, 14 Oct 2015 23:46:44 +0800</pubDate>
      <link>https://ruby-china.org/topics/27678</link>
      <guid>https://ruby-china.org/topics/27678</guid>
    </item>
    <item>
      <title>Rails 配置 webpack</title>
      <description>&lt;p&gt;趁着国庆假期，在项目的前端搭上了 webpack，以便更好地模块化管理前端代码。这里和大家分享一下，期待更多交流。（参考了这篇业界良心的 tutorial：&lt;a href="http://clarkdave.net/2015/01/how-to-use-webpack-with-rails" rel="nofollow" target="_blank"&gt;http://clarkdave.net/2015/01/how-to-use-webpack-with-rails&lt;/a&gt;）&lt;/p&gt;
&lt;h4 id="基本配置"&gt;基本配置&lt;/h4&gt;&lt;h5 id="安装 webpack"&gt;安装 webpack&lt;/h5&gt;
&lt;p&gt;在项目的目录下创建 package.json 来管理需要的外部 module：&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"the app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"coffee-loader"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^0.7.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"coffee-script"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.10.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"exports-loader"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~0.6.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"expose-loader"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~0.6.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"imports-loader"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~0.6.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"css-loader"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~0.6.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"underscore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~1.8.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"webpack"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~1.4.13"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jquery"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~2.1.4"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装需要的 module（墙内可以使用淘宝镜像 &lt;a href="https://npm.taobao.org/" rel="nofollow" target="_blank"&gt;https://npm.taobao.org/&lt;/a&gt; ）&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装 webpack&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g webpack
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id="配置 webpack"&gt;配置 webpack&lt;/h5&gt;
&lt;p&gt;由于 webpack 本身功能的强大，配置文件也可以很复杂，这里简单配置一下，添加一个叫 webpack.config.js 的文件&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;webpack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;webpack&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// 告诉 webpack 去哪里找 entry 文件&lt;/span&gt;
  &lt;span class="c1"&gt;// entry 文件最终会被 compile 出来&lt;/span&gt;
  &lt;span class="c1"&gt;// 我们将新的 js 代码都统一放在 app/frontend/javascritps 文件夹下面 &lt;/span&gt;
  &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app/frontend/javascripts/entry.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 告诉 webpack 根据 entry 文件编译出来的文件叫 bundle.js&lt;/span&gt;
  &lt;span class="c1"&gt;// 并把文件生成到 app/assets/javascripts 目录下，这样 Rails 的 Asset Pipeline 便可以直接使用&lt;/span&gt;
  &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;assets&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;javascripts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bundle.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;publicPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/assets&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 告诉 webpack 可引用文件的后缀&lt;/span&gt;
  &lt;span class="c1"&gt;// 比如我们添加了 '.js'，所以可以用 require('app') 来代替 require('app.js')&lt;/span&gt;
  &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.coffee&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;loaders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;// 用来 load CoffeeScript&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;coffee$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;coffee-loader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;entry.js 可以是任何 js 文件，里面可以通过 require 来引用其他的 module，举个例子：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;underscore&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;foo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id="运行 webpack"&gt;运行 webpack&lt;/h5&gt;
&lt;p&gt;运行以下命令，webpack 会根据上一步的配置文件生成一个 bundle.js&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;webpack -d --display-reasons --display-chunks --progress
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后只需要在 view 里引用生成的 js 文件（bundle.js）&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= javascript_include_tag 'bundle'  %&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h5 id="配置bower"&gt;配置 bower&lt;/h5&gt;
&lt;p&gt;因为有些 module 只有 bower 有，所以我们可以在使用 npm 的同时也使用 bower
安装 bower&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g bower
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加 bower.json&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"the app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jquery"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~1.11.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 webpack 配置里添加 bower_components&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="na"&gt;modulesDirectories&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node_modules&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bower_components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再添加一个 plugin（这里感叹一下 webpack 的 plugin 相当之丰富）&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;plugins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="c1"&gt;// 告诉 webpack 除了 package.json，还可以去哪里寻找 module 的描述&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ResolverPlugin&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ResolverPlugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DirectoryDescriptionFilePlugin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bower.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;main&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置好之后就可以同时使用 npm 和 bower 的 package 啦&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bower install
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id="多个 entry 文件"&gt;多个 entry 文件&lt;/h5&gt;
&lt;p&gt;以上的配置都只是一个 entry 文件（entry.js），有时候需要多个 entry 文件来更好分离不同页面的 js，那么可以使用以下配置：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;entry1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app/frontend/javascripts/entry1.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;entry2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app/frontend/javascripts/entry2.js
  }
  ...
};

config.output = {
  ...
  // 生成的文件直接使用 entry 的名称来命名
  filename: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nx"&gt;_bundle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;,
  ...
};
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后我们在 view 里需要的地方便可使用 entry1_bundle.js 和 entry2_bundle.js&lt;/p&gt;
&lt;h5 id="开发环境设置"&gt;开发环境设置&lt;/h5&gt;
&lt;p&gt;开发环境里可以使用以下的命令让 webpack 保持自动编译前端代码：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;webpack --watch --colors
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当然也可以使用 foreman 统一设置，比如我们项目的 Procfile：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sidekiq: bundle exec sidekiq
web: rails server
webpack: webpack --watch --colors
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="教程里还提到了一些高级的配置，感兴趣的同学可以试试"&gt;教程里还提到了一些高级的配置，感兴趣的同学可以试试&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;配置全局 module，比如配置 jQuery 之后，不需要在每个文件都 $ = require('jquery')。&lt;/li&gt;
&lt;li&gt;自动提取共享 module，使用 webpack.optimize.CommonsChunkPlugin 来自动抽取不同 entry 文件里面共用的 module，生成一个新文件。&lt;/li&gt;
&lt;li&gt;生产环境可以给生成的 js 文件添加类似 Rails 的 fingerprint。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="待解决问题"&gt;待解决问题&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;生产环境下 Rails 会给图片添加 fingerpint，所以之前有些 js 文件添加了 .erb 后缀通过服务器渲染来使用 asset_path 调用图片。webpack 对于此类 js 似乎没有一个优雅的解决方案。目前我的做法是将这些 js 继续保留在了 Asset Pipeline 里。&lt;/li&gt;
&lt;li&gt;webpack 是支持打包 css 和 image 的，还在研究如何将 Rails 里的 CSS/SASS 也使用 webpack 打包。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="后记"&gt;后记&lt;/h4&gt;
&lt;p&gt;团队目前有两名 Rubyist，本来是想等招到前端再来好好做一下模块化，但苦于厦门靠谱前端难寻，趁着国庆假期终于下决心自己撸。个人感觉 webpack 这货非常之强大，CommomJS、AMD、ES6 语法任君选择，但配置相对复杂些。这里特别感谢老同学 Strikingly CTO 郭达峰&lt;a href="/dfguo" class="user-mention" title="@dfguo"&gt;&lt;i&gt;@&lt;/i&gt;dfguo&lt;/a&gt;  的推荐，也很期待下周 RubyConf 上 Strikingly 团队关于 webpack 的分享。&lt;/p&gt;</description>
      <author>citysheep</author>
      <pubDate>Fri, 02 Oct 2015 00:31:08 +0800</pubDate>
      <link>https://ruby-china.org/topics/27537</link>
      <guid>https://ruby-china.org/topics/27537</guid>
    </item>
    <item>
      <title>[厦门] 绝对靠谱的初创公司招 Ruby 工程师 (5~10k + 期权激励)</title>
      <description>&lt;p&gt;我们是 T 社，一个 T 恤众筹的平台。团队在北京融资顺利，开始在厦门组建早期开发团队。需要招聘全栈 Rubyist、Web 前端和 UI 设计师。如果你想拿着一线城市的工资，在一个非常宜居的地方享受创业，打造一款出色的产品，并收获丰厚回报，T 社绝对是一个不错的选择。&lt;/p&gt;

&lt;p&gt;在 T 社，发起人可以在线设计 T 恤、发起众筹，低成本地向粉丝推广自己的品牌。支持者们可以参与众筹，用实际行动支持自己心仪的团体或个人。我们的口号是：把喜欢穿在身上。T 社的 beta 版本：&lt;a href="http://tshe.me" rel="nofollow" target="_blank"&gt;http://tshe.me&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;我们创始团队三人，都是 85 后。创始人是剑桥海归、顶级 VC 的投资人出来创业，人脉很广（所以我们融资很顺利，也和很多互联网公司关系紧密）。另一位合伙人在福建的家族企业，和国内许多知名服装品牌有很好的合作关系（所以我们线下供应链资源优势明显）。我本人是技术合伙人，大学时候做过百万用户的 Facebook App，之前在香港的瑞士信贷开发算法交易系统，在 IDG 做过自由人，还创立过留学网站 GradChef 毕老师（所以我们懂技术，也很了解互联网）。&lt;/p&gt;
&lt;h3 id="全栈 Rubyist"&gt;全栈 Rubyist&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;熟悉 Ruby On Rails，有一定的实战经验（有 Python 或者 Node.js 经验也可以考虑）&lt;/li&gt;
&lt;li&gt;熟悉前端开发，了解一种或以上 JavaScript 框架&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tshe.me/jobs/rubyist" rel="nofollow" target="_blank"&gt;http://tshe.me/jobs/rubyist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="Web前端工程师"&gt;Web 前端工程师&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;熟练掌握 HTML、CSS、JavaScript，包括 HTML5 和 CSS3&lt;/li&gt;
&lt;li&gt;熟悉一种或以上 JavaScript 框架&lt;/li&gt;
&lt;li&gt;具有移动端网页开发的相关经验，熟悉 Responsive Web Design&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tshe.me/jobs/frontend" rel="nofollow" target="_blank"&gt;http://tshe.me/jobs/frontend&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="UI设计师"&gt;UI 设计师&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;曾经参与和主导过大型网站项目设计&lt;/li&gt;
&lt;li&gt;熟练掌握做图工具，如 Photoshop、Adobe Illustrator&lt;/li&gt;
&lt;li&gt;具有移动端网页设计的相关经验，熟悉 Responsive Web Design&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tshe.me/jobs/design" rel="nofollow" target="_blank"&gt;http://tshe.me/jobs/design&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="福利"&gt;福利&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;有竞争力的薪酬&lt;/li&gt;
&lt;li&gt;期权激励&lt;/li&gt;
&lt;li&gt;作为早期员工，参与制定公司福利、招人、打造团队文化，T 社的未来会因你不同！&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="报名方法"&gt;报名方法&lt;/h3&gt;
&lt;p&gt;如果对 T 社感兴趣，或者想了解更多，欢迎发送邮件至：hi@tshe.me。欢迎附上你的简历或者相关作品（做过的项目，github，dribble 等）&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;我们非常期待与你在 T 社相聚！&lt;/strong&gt;&lt;/p&gt;</description>
      <author>citysheep</author>
      <pubDate>Wed, 15 Jul 2015 23:02:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/26506</link>
      <guid>https://ruby-china.org/topics/26506</guid>
    </item>
    <item>
      <title>各地 Rubyist 圈子如何？</title>
      <description>&lt;p&gt;之前听说深圳、上海的 Ruby 社区要好过北京，不知道是不是这样呢？
其他地方比如广州、厦门的 Ruby 社区如何？&lt;/p&gt;</description>
      <author>citysheep</author>
      <pubDate>Tue, 23 Jun 2015 18:14:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/26141</link>
      <guid>https://ruby-china.org/topics/26141</guid>
    </item>
  </channel>
</rss>
