Ember 6.12: What's New and Noteworthy in the Latest Ember Release
Ember.js continues to evolve with Ember 6.12, bringing performance improvements, developer experience enhancements, and a few exciting new APIs. Whether you're a long-time Ember developer or just getting started, this release has something for you.
In this hands-on guide, weโll walk through the key updates in Ember 6.12 with real code examples, step-by-step explanations, and practical tips to help you upgrade and use the new features effectively.
โ Step 1: Upgrade to Ember 6.12
Before diving into new features, letโs make sure your app is on the latest version.
# Navigate to your Ember project
cd my-ember-app
# Upgrade Ember CLI and dependencies
npm install --save-dev ember-cli@latest
ember update
Alternatively, use the interactive upgrade tool:
npx ember-cli-update
Follow the prompts to upgrade to 6.12. After upgrading, verify your version:
ember --version
# Should output: ember-cli 6.12.0
๐ก Tip: Always back up your project or use version control (like Git) before upgrading.
๐ Whatโs New in Ember 6.12
1. Stable <template>-Only Components (No More .js Files!)
One of the most exciting changes is that template-only components are now stable and donโt require a backing JavaScript class.
โ Before (Ember < 6.12)
You needed a .js file even for simple components:
// app/components/hello-user.js
import Component from '@glimmer/component';
export default class HelloUserComponent extends Component {}
<!-- app/components/hello-user.hbs -->
<p>Hello, {{@name}}!</p>
โ Now (Ember 6.12)
You can create a component with only a .hbs file:
<!-- app/components/greet-user.hbs -->
<div class="greeting">
๐ Welcome, <strong>{{@name}}</strong>!
</div>
And use it directly in any template:
<!-- app/templates/application.hbs -->
<GreetUser @name="Alex" />
โ No JavaScript file needed. Cleaner, simpler, and faster to prototype.
2. Enhanced @use and @classicDecorator Warnings (Prep for Octane+)
Ember 6.12 improves deprecation messages for legacy patterns, helping you migrate to modern Octane syntax.
Example: Classic Object Model Deprecation
If you're still using Ember.Object, youโll now see clearer warnings:
// app/components/old-component.js
import EmberObject from '@ember/object';
export default EmberObject.extend({
name: 'Legacy',
sayHello() {
console.log(`Hello from ${this.name}`);
}
});
After upgrading, youโll see a deprecation warning like:
DEPRECATION: Usage of
EmberObject.extendis deprecated. Use native classes instead.
โ Fix: Migrate to Native Classes
// app/components/modern-component.js
import Component from '@glimmer/component';
import { action } from '@ember/object';
export default class ModernComponent extends Component {
name = 'Modern';
@action
sayHello() {
console.log(`Hello from ${this.name}`);
}
}
3. **New {{perform}} Syntax in ember-concurrency (Now Built-in!)
ember-concurrency is now officially integrated into Ember 6.12, bringing first-class async task support.
โ Install (if not already included)
ember install ember-concurrency
โ
Use perform in Templates
// app/components/async-button.js
import Component from '@glimmer/component';
import { task } from 'ember-concurrency';
export default class AsyncButtonComponent extends Component {
@task
*fetchData() {
yield timeout(1000); // simulate API call
console.log('Data loaded!');
}
}
<!-- app/components/async-button.hbs -->
<button
type="button"
{{on "click" (perform this.fetchData)}}
disabled={{this.fetchData.isRunning}}
>
{{if this.fetchData.isRunning "Loading..." "Click Me"}}
</button>
โ No more
.perform()in JavaScript โ use(perform)directly in templates!
4. Improved Error Handling in Templates
Ember 6.12 provides better error messages when you make common template mistakes.
Example: Invalid Modifier Usage
<!-- Before: Silent failure or unclear error -->
{{on "click" this.handleClick}} <!-- Missing parentheses -->
<!-- Now: Clear error message -->
โ
Correct usage:
{{on "click" this.handleClick}}
Or with arguments:
{{on "click" (fn this.handleClick "arg1")}}
Youโll now get helpful messages like:
Template Error: Expected a function for
{{on}}, but got undefined. Did you forget@for an argument?
5. Faster Builds with Vite Support (Experimental)
Ember 6.12 introduces experimental Vite support for faster development builds.
โ Enable Vite (Experimental
โ Professional
Top comments (0)