środa, 17 lipca 2013

Deploying emberjs app on production

Things you should do when deploying your emberjs app on production.

Catch errors.

window.onerror - most basic but gives you not many message, file, line. In development you might think "yeah I know where is the error!". But in production you will get message, line and column from your one big js file. Moreover here ends errors from user browser extensions. So if you will see "Script error;" or one of my last favorite "The RPC server is unavailable" don't ask yourself wtf, just leave it.

Ember.onerror - better and gives us some kind of stacktrace. But it not covers everything. In ember we have promises and you may write @user.save().then => dummy.trim() That error will go into void and you will not be informed about this error. Sucks.

When you catch error:

  • Notify yourself about them. Write your own controller witch will send some email or use airbrake.io.
  • Track user actions? After bunch of errors without any stacktrace I've decided to track user actions(see on gits)
  • Limit errors. Sometimes your code will stuck in some loop and produce hundreds of errors you don't want them.

Leave some failover.

It is good to leave old version which use the old non spa. You may give the user choice if they want to try new version with better user experience or stay for now with old one. 
Still want somehow support old ie7(6)? Maybe your ember app works with them but it will be damn slow and time you spend for fixing bug for browser used by 1% of your users is not worth. 

Don't rollback everything.

If you want to rollback your spa from production don't touch api endpoints. Someone already uses your ember app and it may work for him. When you remove api endpoints it will definitely broke it.

You deployed fix and nothing changed?

Well probably it was not a good fix :)
But there is also situation when you deploy new assets on production it will not reload existing code in user browser so some errors from old codebase may still appears. Check the current js filename and compare it with error details.

Ember-data error handling? Forget.

Make sure that you handle 500 errors from api. They can happen when you have error in you api code but also when user have very bad connection and your http server just drops request. Normally (in no spa world) user see standard browser site that he should check connection. In ember everything will just stuck, your model object will come into isSaving state or isError and any further changes modifications will be not available. 

What we can do? 
Not much, currently (rc6.2) we don't have good error handling in ember-data. It is possible to detect error(http://discuss.emberjs.com/t/how-to-know-when-a-transaction-has-been-committed/1385/2 )
but after that you can try to rollback your transaction. The last option is just to reload page when you detect error.