We are pleased to announce that both Ember.js 1.8.0 and the first beta in the
1.9 series have been released. This comes as the eighth cycle of our release
process that began after 1.0 was released.
This release represents the effort of at least 40 contributors across over 600 commits.
Major rendering-layer refactor ("metal-views")
In previous versions of Ember.js, the HTML of a page was created (via
Handlebars) and assembled (via the render tree) using string concatenation. In
Ember.js 1.8, fragments of a page are still created (via Handlebars) as
strings, but are then parsed into DOM and assembled as a DOM tree.
Metal-views is the first part of the HTMLBars effort to land in Ember. It is
an important step towards the complete removal of strings from the Ember.js
rendering pipeline.
Introducing HTMLBars into Ember incrementally demonstrates the community's
commitment to semantic versioning, and to improving the framework without
abandoning existing codebases.
Some of the immediate benefits of this refactor are:
- The removal of recursion from the rendering layer. This decreases garbage
collection pressure during rendering and allows the re-use of objects during
render (for example, the render buffer). - Improved HTML namespace and contextual element tracking. This introduces
support for components, data-binding, and logic within inline SVG documents.
Example JSBin - Prior versions of Ember.js relied upon script tags to mark
regions of data bound content. For example, a template that has{{name}}
might be rendered into the page as:
Bob
These script tags could interfere with :first-child
and other CSS selectors,
and were a general nuisance. In Ember.js 1.8 the library powering these
bindings (metamorph.js) has been
replaced with a completely re-written engine that uses blank text nodes
(morph.js). One of the major touted benefits of HTMLBars, the Ember team is
happy to make this a reality in 1.8.
Many thanks to @krisselden,
@ebryn, @mmun,
@mixonic, and all developers who took time to
test their applications on 1.8 beta. Delivering this update without breaking
1.x API compatibility took a significant community effort.
Performance Improvements
Ember.js 1.8 comes with several performance improvements in other parts of the
codebase.
- Ember.js APIs often require the use of a string to lookup a class or route.
Often these strings must be passed through a normalization step before they are
used, such as pluralizing, singularizing, or changing snake_case to camelCase.
1.8 introduces several caches for these operations, resulting in common
operations being performed far fewer times. - The refactoring of commonly de-optimized functions in v8 and other browsers.
- The conversion of
MANDATORY_SETTER
from a runtime flag into a build-time
feature flag. This allows relevant code paths inget
andset
to be slimmer
in production builds.
Thanks to @stefanpenner and
@twokul for their continued efforts on
performance tuning.
Notable Deprecations
As Ember.js moves forward, various APIs are deprecated to allow for their
removal in a later major release (such as 2.0). With this release a
deprecations page has been added to
the Ember.js website. This guide will help developers refactor their code away
from old APIs.
Four notable deprecations are added with the release of 1.8.
Ember.Set
is a class for managing an unordered collection of objects (api
docs). It is a private API and
thus subject to change, however several libraries have chosen to use it despite
this. Since the addition of this API to Ember, the ES6 draft has matured in its
description of a native JavaScript Set class.Ember.Set
is not compatible
with the upcoming API, and is now deprecated.- In an effort to more closely align
Ember.Map
with ES6, theremove
method
has been deprecated in favor ofdelete
. - The
currentWhen
property on links is deprecated in favor ofcurrent-when
.
This property name more closely tracks how component properties will be used in the
future. - Old versions of Ember.js, the guides, and the API documentation suggested
looking up views as globals. For example{{view App.SomeView}}
. In
Ember.js 1.8 this style of view lookup is deprecated in favor of using a
string, similar to how other class lookups behave in Ember. See
this page
for details about transitioning away from global view lookups. - URLs containing a hash and no
/
, such as/foo#bar
are handled by the
router'shash
location handler. When using theauto
location handler, the
presence of#
will cause thehash
handler to be chosen over thehistory
handlers, despite the lack of a leading/
in the path (for example/foo#/bar
.
This makes using anchors with thehistory
handler impossible. Ember.js
1.9 will correct this bug, and in 1.8 a deprecation is raised.
Breaking Changes
Ember.js strives to maintain strict API compatibility across minor releases.
In cases of API inconsistency or where behavior is unspecified, breaking changes
may be introduced to resolve the issue. Additionally, deprecated APIs may
be removed if they were from a previous major release (such as pre-1.0
deprecations).
In this release there are several small breaking changes that may impact your
application.
didInsertElement
is now always called on a child view before it is called
on a rendering parent view. In previous releases of Ember.jsdidInsertElement
would often be called first on a parent view, however this behavior was
inconsistent. In general, developers are encouraged
to consider scheduling work into theafterRender
queue if it includes
accessing DOM not immediately under that view's control.- Actions defined directly on the controller object
and not in theactions:
hash have been deprecated since Ember.js 1.0. In
Ember.js 1.8 support for those actions has been removed. Ember.Map
has been tweaked to more closely match the ES6 spec forMap
. The
forEach
callback now takesvalue,key,map
as arguments. Previously it was passed
key,value
. This API is private, but several libraries have chosen to use it
despite this. Ember-Data now includes a polyfill.Ember.OrderedSet
, a super class ofEmber.Map
, has
also had minor ES6 cleanups applied.
to allow consistent usage across the pre-1.8 and 1.8 API.- Ember.js has long had an run-time flag called
MANDATORY_SETTER
. With this
flag enabled, attempts to set an observed object property without the use of
Ember.set()
would throw an error (a desirable behavior for development
builds). This runtime flag has been changed to a
standard build-time feature flag namedmandatory-setter
, allowing it to
be removed from production builds entirely.
Ember.js 1.9 beta
As with any minor release of Ember.js, the current canary branch is forked
to become the next beta. This ensures a constant graduation of features and
improvements for release. Builds of beta are made available every
week for six weeks, then promoted to release.
In Ember.js 1.9 several new features and changes will be introduced.
- "Streams" are a new Ember.js internal that replace bindings at the lowest
level of the Ember rendering pipeline. They greatly simplify the implementation
of template helpers and are yet another important step toward the landing of
HTMLBars. - Handlebars 2.0 will be required for Ember.js 1.9. See this summary
of the transition
for more details. - Further performance improvements and bugfixes.
Changelogs