Tips on Ember 2 对我来说是没什么计划性的写作,我只是把它当做是每天工作的总结日志,一个很重要的目的是为团队做一些技术事务的整理,以帮助一些新人快速成长起来。如果有些内容不能满足各位看官的胃口,提前说声抱歉并且请不要担心,随着项目的逐渐开展,好戏会在后头。
上一篇我提到了暂时使用 Ember.GlimmerComponent
取代 Ember.Component
的事情,虽然有效但是却不得不改变编写 Component 的接口,着实挺烦的。其实我们可以直接替换掉旧的 Ember.Component
便好,于是我加了很简单的一句:
// app/app.js
// ...
Ember.MODEL_FACTORY_INJECTIONS = true
Ember.GlimmerComponent.reopenClass({
isComponentFactory: true
})
Ember.Component = Ember.GlimmerComponent
App = Ember.Application.extend({...})
这样你 Component 该怎么写就怎么写,不用再改了。
我是 Vim 党,很少折腾复杂笨重的 IDEs,然而小伙伴们不高兴了,纷纷表示 Vim 太难学还是要用 Webstorm(也有选择 Sublime/Atom 的,由于配置比较简单,略过)。好,你用就用吧,各种问题自己也不会看文档问谷歌,成天怨声载道的(不得不吐槽一下现在的年轻人……)。没办法,我自己来一遍配置,填掉所有的坑!
Webstorm 以前用 Angular 的时候也试过,总体上还行,代码补全比较优秀,就是稍微有点慢;然而我是那种不依赖自动补全,就是喜欢手打的类型,所以还是轻便迅捷的 Editor 合我的胃口。这次换成搭配 Ember 和 Ember CLI 了,好家伙~各种小问题层出不穷,官方就是不支持你也没有办法,最终我只能整理一下力所能及的配置过程了——
在 Webstorm 导入 Ember CLI 创建好的项目之后,打开[Preferences -> Project -> Directories],然后针对项目里的各种目录打一些必要的标记;如图:
简要解释一下这三个标记的作用:
tmp/
去掉这个标记试试看!src
属性和 CSS 里面的 url()
等等……OK,后面两个其实是调整 Webstorm 性能与功能的关键平衡点,标记的过少会导致很多智能特性发挥不了用处,反之则会严重降低 IDE 的运行性能。我 09 年的老爷机通过合理配置(和上图那个 Demo 不完全一样,需要自己摸索)之后跑得比最新的 MBP 还顺畅我会随便乱讲?
为什么使用 io.js?有关 node.js 和 io.js 的纠结历史可以去谷歌一下,此处不再啰嗦;最根本的原因就是 io.js 对 ES6 的支持更好,更新和维护也更勤快。好消息是不久以后当 io.js 进入 v4 的时候,node.js 和 io.js 将再次合并,从此以后将只有一个 node.js v4 了。
node.js 和 npm 那边配置好以后呢,在这里会出现 Node.js v3.2.0 Core Modules,如上图所示我已经把它更名为 io.js v3.2.0 Core Modules 了。最上面那个 ember-DefinitelyTyped 是 TypeScript 社区提供的 API Stubs,有助于快速的代码补全提示。TS Community 还提供了大量的 JS 库或框架的 API Stubs,非常便利。这些都可以在这个界面里搜索和安装。
Ember CLI 集成了代码质量控制工具 JSHint,Webstorm 也有很棒的内部支持,不过配置要跟着上图来,否则是没有用的。
这些是关于模版引擎的支持,现在 Ember 已经使用了全新的模版引擎:HTMLBars,目前没什么 IDE 有完整支持的,最贴近的还是 Handlebars 插件(可能需要自行安装或开启,见[Preferences -> Plugins])。
.hbs
,没有 .html
什么事情),选不选都一样Bower 的支持配置很简单,路径选对就是了。
就这些,Webstorm 对 Ember 和 Ember CLI 的支持也就这样了,真心很有限,感觉有点对不起它的名声呀,我觉得你们大家还是投入到 Vim 的怀抱来吧!
最后奉送一个 tip,在 v2.3 的 Routable Components 到来之前有用的:
什么是 toplevel component/view 呢?就是应用初始化后在 <body>
标签里插入的第一个 DOM 元素,它通常是这样的:
<body>
<div id="ember-xxx" class="ember-view">...</div>
</body>
它看起来和其他的 components 差不多,唯一的问题是如果你想改它的 tagName/elementId/classNames 等属性的时候该怎么办?
创建一个 ApplicationComponent?没用……创建一个 ApplicationView?对不起,View 已经没了……
在 Routable Components 出来之前(其实这就是一个典型的 Routable Component),唯一修改它的办法其实是创建一个叫 ApplicationView 的 Component——啥意思?看下面:
$ ember generate view application
然后编辑 app/views/application.js
import Ember from 'ember'
export default Ember.Component.extend({
tagName: 'main',
classNames: ['application']
...
})
如上,它是一个 Component,但要保存在 app/views
下面,否则是找不到的。