understand ES6 modules. However, you can get around that by using a transpiler, like Babel, to turn the ES6 import syntax into CommonJs or AMD modules. This approach is effective but has one important caveat for dynamic loading. The module syntax addition (import x from 'foo') is intentionally designed to be statically analyzable, which means that you cannot do dynamic imports. // INVALID!!!!!!!!! ['lodash', 'backbone'].forEach(name => import name ) Luckily, there is a JavaScript API “loader” specification being written to handle the dynamic use case: System.load (or System.import ). This API will be the native equivalent to the above require variations. However, most transpilers do not support converting System.load calls to require.ensure so you have to do that directly if you want to make use of dynamic code splitting. ES6 Modules