IMO
- Not on TC-39, not speaking for Mozilla
 
- My origins: RequireJS, AMD
 
The Known Lands
ECMAScript 6
ES: Module declaration
// ! ES has important semantic diffs with AMD/CommonJS/Node analogs
// Import of default export. AMD, CommonJS/Node: require('x')
import x from 'x';
// Non-default import from 'lib'. AMD, CommonJS/Node: require('lib').y
import { w } from 'lib';
// Named export. AMD, CommonJS/Node: exports.y
export let y = ...;
// and/or
// Default export. AMD: return, Node: module.exports
export default function() {};
// Dynamic
// AMD: require([something + '/z']) Node: require(something + '/z')? sync
System.import(something + '/z', function(z) {});
Module Loader
From js-loaders: System.import('adventure')
- 
System.normalize - IDs to normalized form
 
- 
System.locate - ID to URL
 
- 
System.fetch - get the source at URL
 
- 
System.translate - convert source to JS
 
- 
System.instantiate - custom module translation
 
AMD loader plugins:
- normalize
 
- 
load - locate, fetch, translate, instantiate
 
JS environments
Browser makers, us
ID normalization
- ./ and ../
 
- Allow URLs? Maybe not
 
- Loader plugin syntax? 'text!template.html'
 
Declarative loader config
- AMD has a set
 
- paths, map, module config [not packages]
 
- shim - LEGACY 4EVAR?
 
Inline module syntax
module 'id' {} would be sweet
Inline module syntax
- 
<module>, <script type="module">
 
- zip/archive URLs
 
- loader.define(id, srcString)
 
Our apps
- Bridging ES6 and AMD, Node worlds
 
- Project layout
 
- Package managers
 
Bridging worlds, AMD
- 
ES6->AMD: es6-module-transpiler
 
- 
AMD->ES6: Command line tool, trivial transform
 
- 
Combo: Bootstrap: AMD-style config, plugins, adapter
 
Project Layout
- baseURL + moduleID + '.js'
 
- 
import x from 'x' -> baseURL + 'x.js'
 
* index.html
* app/ -> main.js, view.js
* lib/ -> jquery.js, underscore.js
* app.js:
requirejs.config({
    baseUrl: 'lib',
    paths: {
        app: '../app'
    }
});
// Start loading app.
requirejs(['app/main']);
// app/main uses relative IDs for other
// app modules: './view'
Package managers
baseURL + moduleID + '.js'
- Single file deps: baseURL + moduleID + '.js'
 
- Your metadata in app package.json or .metadata dir
 
Package managers
Packages directories still OK
- Adapter module at baseURL + moduleID + '.js'
 
// node
module.exports = require('x/main');
// AMD
define(['x/main'], function(x) {return x});
// ES
export default from 'x/main'; //maybe?
Package managers
- Local vs repo name
 
- 'underscore' -> 'lodash', branches, forks