GithubHelp home page GithubHelp logo

es-module-loader's People

Contributors

addyosmani avatar also avatar arv avatar brettz9 avatar calvinmetcalf avatar caridy avatar danharper avatar douglasduteil avatar dtinth avatar erikringsmuth avatar guybedford avatar jansauer avatar jgable avatar joeldenning avatar johnjbarton avatar josh avatar justinbmeyer avatar leedm777 avatar mason-stewart avatar matthewp avatar nevir avatar orand avatar passy avatar paulirish avatar pkozlowski-opensource avatar probins avatar schnittstabil avatar sheerun avatar sindresorhus avatar unional avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

es-module-loader's Issues

Esprima parser update

As per the readme, the ES6 Esprima Harmony parser is being used to do parsing, loaded only when necessary. This parser still uses an older syntax, which is currently the major critical issue to sort out for this polyfill.

@guybedford suggested that we explore alternatives and I agree.

System.baseUrl

Looks like this is something that used to be in the spec, but disappeared in the last revision.

Integrate Traceur (source map support)

I've been considering how to go about polyfilling ES6 functionality dynamically (classes, etc) with this module, and there is a development workflow that could make sense.

Particularly, I was considering how one could load https://github.com/addyosmani/traceur-todomvc without a build step when in development.

The basic idea would be to compile the ES6 with Traceur before execution. For an example of this see https://github.com/guybedford/es6.

Basically it would be added as a "translate" step in the loader:

  System.translate = function(source) {
    // copy code from https://github.com/guybedford/es6/blob/master/es6.js#L4
  }

The integration is actually quite simple as all the code is readily available. The question is whether we want to encourage this or not?

Switch to Traceur entirely for parsing

While this is the difference between an 800KB parser and a 100KB parser, since this module is being used to polyfill ES6 syntax, we need to unify the parser and not have two parsers being used.

Additionally, this module can be used to polyfill module loading of all other module formats, without having to download the parser anyway.

The only use case that would suffer from using Traceur is for users who want to use ES6 module syntax with ES5 code. But that is what AMD and CommonJS are for anyway.

So I think this change can align the module quite nicely around the full ES6 workflow,

Export default behavior

When importing code like:

export default ...

...

...I would have expected that such an export would cause the exported object to be directly available on the corresponding import callback argument without needing to get to it with the "default" property...

If this is the correct behavior, Is the "default" property specced anywhere?

Thanks...

IE10 issue with global properties

IE10 doesn't and apparently hasn't worked when trying to access the global/_global properties. defineProperty does not appear to be the problem for IE10 (and IE10 can use Object.defineProperty on normal objects unlike IE8 which can only use it on DOM objects), but rather these lines at the top of the Loader constructor:

Global.prototype = options.global || (isBrowser ? window : {});
this._builtins = new Global();

Adding alert(this._builtins) gives an error here.

When the this._builtins property is used later, there are therefore problems there as well when access is attempted:

Global = function () {}
Global.prototype = this._builtins;

this._global = new Global();

Adding alert(Global.prototype); or alert(this._global); after the above lines gives an error too.

IE10 appears not to allow access if the window is used as another object's prototype (I also got the same errors when I tried iterating over the window's properties to assign them to the prototype instead of using window directly).

Should all loaders use the same module registry?

At the moment, each custom loader is using its own registry, but is this a good idea? It remains to be seen how browsers implement loaders, but for the moment ISTM it would be better if they all used the same one.

Provide example of usage for a page

There should be a simple example project where using modules should help the development. It should also have quite many comments from devs. :)

Considering a System addon library

Having spent a while working on jspm, I think it might just be possible to append functionality to the System loader instead of having an entirely separate loader.

I'm thinking of putting together a library as a "System addon" for things like AMD support, CommonJS support, map config, etc, which can be selectively included in the loader as needed, enhancing functionality.

A full list of features would be:

  • AMD, CommonJS, and Global Shim support
  • map config support
  • plugin support

Effectively this would be a very stripped down version of the jspm loader, but appending its functionality to the System loader in a backwards compatible way.

Thanks to @probins for the initial inspiration on this.

What do others think? Also any ideas for names? SystemJS is the best I've come up with... could do with some creative input!

I can probably get a prototype up within a week, working out interest and how it is presented is probably the hardest part.

Local tests

Currently the only tests are from the jspm-loader running against this.

We need to bring in a full test coverage here, including examples such as:

// scripts/crypto/random.js
export default function() { ... }

// scripts/crypto/guid.js
import random from './random';
export default function() { ... }

// test.js
import guid from './scripts/crypto/guid';
console.log(guid())

// bar/test.js
import guid from '../scripts/crypto/guid';
console.log(guid())

Allow for compiling separate files from terminal

I have a project that consists from ~100 modules (files). It doesn't make sense to compile all those files in browser each time when I reload the app. There should be a terminal option to build a single ES6 file with import/export statements into corresponding ES5 file.

Updated hooks and syntax parsing

I've managed to adapt the loader to use the new "link" hook and updated the other hooks as documented here - https://gist.github.com/wycats/51c96e3adcdb3a68cbc3.

I have also included Esprima's syntax parser to fully support "import", "module" and "export" statements in loaded modules. The great thing about the Esprima parser is that it is only 60KB making the full polyfill less than 70KB minified.

I can provide this as a pull request if you are interested?

https://github.com/guybedford/es6-loader

Documentation Details

@guybedford for the README:

  1. Mention if loading a JS file (or files) is done sync or async
  2. Document the pre-configured loader, all attributes. For example, what you mean with System.baseURL. What does the System object contain? (btw, System is a bit generic, perhaps use SystemLoader would be better). Include comments/document what each of the Custom Loader attributes does (ie normalize).

Thanks :)

Esprima is being transcoded by traceur in traceur-test.html

While tracking down issue #45, I discovered that traceur-test.html cause esprima to be transcoded by traceur.

After we xhr the content of es6-file.js we call
fulfill(xhr.responseText);
which is fetch callback
this.fetch(url, function(source) {
opt.address = url;
opt.type = 'module';
source = self.translate(source, opt);
self._linkExecute(name, source, opt, _callback, _errback);
}, _errback, opt);
so we enter _linkExecute with the transcoding of es6-file.js.

There we call loadEsprima. But the loader is now transcoding all inputs.

At the end of translate:
source = traceur.outputgeneration.ProjectWriter.write(res, opt);
if (isBrowser)
source += '\n//# sourceMappingURL=data:application/json;base64,' + btoa(opt.sourceMap) + '\n';

we call btoa() on the sourceMap. I added the input source to the sourcemap to get around issue #45, and this source causes a DOM exception
"'btoa' failed: The string to be encoded contains characters outside of the Latin1 range."

Probably something to do with utf16 silliness new recent JS.

Maybe btoa() is a problem, but I don't think you want to transcode esprima in this scenario anyway.

Support other js environments

Ideally the code should be adapted to work as a NodeJS module equally.

Then the System loader could potentially also support fetch in Node, or alternatively one would construct a loader for NodeJS environments.

Dogfooding

Would be nice if this was written in ES6 using Traceur.

Since it's a polyfill for an ES6 feature it kinda makes sense.

Add download links to readme

We can probably add links to:

  • Unminified build
  • Minified build
  • Dependencies

along with some estimated size information.

A browser compatibility list might also be useful.

use @sourceURL

Since we're eval'ing, this content doesnt get added a script to the devtools.

Let's use sourceURL to turn this into a psuedofile so it populates in the devtools

Refreshed site for the project

@guybedford has done some incredible work taking this project further and I think it would help accelerate both testing and general usage by improving both our docs and the current site. I think the recent Traceur changes are worth making a splash about.

This could be something that might be worth exploring in Q1, 2014. I also think it would be useful to define what the goals for ModuleLoader are for next year. E.g:

Do we see ourselves as:

  • A reference implementation that provides a stable, supported version of the draft work Mozilla has done on the loader spec?
  • A reliable loader that we encourage other tools to build on and developers to use in their production apps - e.g JSPM has done a fantastic job building on the project and I could see others similarly switching over to using us.

Other questions:

  • Do we want to push JSPM further as a part of these efforts and do we see it being ready for use in building either demoware or production-level apps too?. I think everyone that's seen it agrees its an amazing sister project, but don't feel its had (yet) the kind of uptake it could. What can we do to change that?

Specification Changes

It would be good to have a single location to track areas of the specification still subject to change, and pointing to the relevant discussion.

To start -

  • Bundling: The extra metadata property in the resolve function is currently aiming to allow metadata relating to the multiple IDs defined by a module bundle. This is still being worked out. Awaiting a link to the discussion emails.
  • Fetch: The fetch function is given a different specification between the prototype (Loader.prototype.fetch) and loader instance (options.fetch). This seems to be a spec issue.
  • System loader resolution: It is still unclear how exactly the js extension is handled. For example, it is unknown whether file.coffee.js should normalize to file.coffee or not.

Resolve conflicts in fetch implementation

The fetch function is given a different specification between the prototype (Loader.prototype.fetch) and loader instance (options.fetch).

As instance functions are provided on the instance object as in the @wycats essay (System.normalize, System.fetch etc), there seems to be a conflict between these.

We should address this.

Latest Specification Update

The full update to the latest specification has just been merged into master. After further testing this can become the 0.4.0 release.

This entirely implements the specification algorithms to the letter now, with all exceptions fully documented.

Feedback and testing welcome. Suggestions on making the readme clearer also very welcome.

Include specification info in source file

The top section of the source file should include the date of the currently implemented specification draft. When es6 is ready, it will mention the final specification details.

Tag a new release

I think that we should consider tagging a new release before more work is done on the roadmap. This will at least give developers a semi-stable point they can try out while development is on-going in master.

Esprima in package.json

Hi,

Exciting to see this project!

I just installed through npm and got an error...Should esprima not be listed as a dependency in package.json?

Thanks...

Exact System normalization of js extension

It is still unclear how exactly the js extension is handled. Unlike RequireJS, the .js extension does not imply a URL and still gets normalized. The question then is whether file.coffee.js should normalize back to file.coffee or not. Awaiting further spec discussion.

Source maps

It is including the //# sourceURL comment, but source maps are necessary to maintain the syntax with the original source. Should be straightforward with the data-uri approach.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.