https://github.com/ember-cli/loader.js
minimal amd loader mostly stolen from wycats.
https://github.com/ember-cli/loader.js
Last synced: 14 days ago
JSON representation
minimal amd loader mostly stolen from wycats.
- Host: GitHub
- URL: https://github.com/ember-cli/loader.js
- Owner: ember-cli
- License: mit
- Created: 2014-03-22T17:56:57.000Z (almost 12 years ago)
- Default Branch: master
- Last Pushed: 2022-12-06T20:59:35.000Z (about 3 years ago)
- Last Synced: 2025-06-11T00:45:08.960Z (8 months ago)
- Language: JavaScript
- Size: 813 KB
- Stars: 79
- Watchers: 13
- Forks: 70
- Open Issues: 30
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
loader.js [](https://travis-ci.org/ember-cli/loader.js)
=========
Minimal AMD loader mostly stolen from [@wycats](https://github.com/wycats).
## No Conflict
To prevent the loader from overriding `require`, `define`, or `requirejs` you can instruct the loader
to use no conflict mode by providing it an alternative name for the various globals that are normally used.
Example:
```js
loader.noConflict({
define: 'newDefine',
require: 'newRequire'
});
```
## Extra stuff
### `define.alias('old/path', 'new-name')`
`define.alias` allows creation of a symlink from one module to another, for example:
```js
define('foo', [], () => 'hi');
define.alias('foo', 'foo/bar/baz');
require('foo/bar/baz') // => 'hi';
require('foo') === require('foo/bar/baz');
```
### `require('require')`
When within a module, one can require `require`. This provides a `require` scoped to the current module. Enabling dynamic, relatively path requires.
```js
define('foo/apple', ['require'], function() { return 'apple'; });
define('foo/bar', ['require'], function(require){ return require('./apple'););
require('foo/bar'); // 'apple';
```
This scoped `require` also enables a module some reflection, in this case the ability for a module to see its own `moduleId`;
```js
define('my/name/is', ['require'], function(require) {
require.moduleId // => 'my/name/is';
});
```
### `define.exports('foo', {})`
`define.exports` enables a fastpath for non-lazy dependency-less modules, for example:
Rather then:
```js
define("my-foo-app/templates/application", ["exports"], function (exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = Ember.HTMLBars.template({ "id": "VVZNWoRm", "block": "{\"statements\":[[1,[26,[\"welcome-page\"]],false],[0,\"\\n\"],[0,\"\\n\"],[1,[26,[\"outlet\"]],false]],\"locals\":[],\"named\":[],\"yields\":[],\"hasPartials\":false}", "meta": { "moduleName": "my-foo-app/templates/application.hbs" } });
});
```
We can author:
```js
define.exports('my-app/template/apple', { hbs: true, "id": "VVZNWoRm", "block": "{\"statements\":[[1,[26,[\"welcome-page\"]],false],[0,\"\\n\"],[0,\"\\n\"],[1,[26,[\"outlet\"]],false]],\"locals\":[],\"named\":[],\"yields\":[],\"hasPartials\":false}", "meta": { "moduleName": "my-foo-app/templates/application.hbs" }});
```
benefits:
* less bytes
* no reification step
* no need to juggle pre-parse voodoo.
### `require.unsee('foo');`
`require.unsee` allows one to unload a given module. *note* The side-effects of that module cannot be unloaded.
This is quite useful, especially for test suites. Being able to unload run tests, mitigates many common memory leaks:
example:
```js
define('my-app/tests/foo-test.js', ['qunit'], function(qunit) {
let app;
qunit.module('my module', {
beforeEach() {
app = new App();
}
// forgot to `null` out app in the afterEach
});
test('my app exists', function(assert) {
assert.ok(app);
})
})
```
---
Note: To be able to take advantage of alternate `define` method name, you will also need to ensure that your
build tooling generates using the alternate. An example of this is done in the [emberjs-build](https://github.com/emberjs/emberjs-build)
project in the [babel-enifed-module-formatter plugin](https://github.com/emberjs/emberjs-build/blob/v0.4.2/lib/utils/babel-enifed-module-formatter.js).
## wrapModules
It is possible to hook loader to augment or transform the loaded code. `wrapModules` is an optional method on the loader that is called as each module is originally loaded. `wrapModules` must be a function of the form `wrapModules(name, callback)`. The `callback` is the original AMD callback. The return value of `wrapModules` is then used in subsequent requests for `name`
This functionality is useful for instrumenting code, for instance in code coverage libraries.
```js
loader.wrapModules = function(name, callback) {
if (shouldTransform(name) {
return myTransformer(name, callback);
}
}
return callback;
};
```
## makeDefaultExport
loader.js creates default exports for ember-cli `amdStrict` mode. If you do not need this behavior you can disable it like so:
```js
loader.makeDefaultExport = false;
```
## Tests
We use [testem](https://github.com/airportyh/testem) for running our test suite.
You may run them with:
```sh
npm test
```
You can also launch testem development mode with:
```sh
npm run test:dev
```
## License
loader.js is [MIT Licensed](https://github.com/ember-cli/loader.js/blob/master/LICENSE.md).