JSPM

expose-members-loader

0.0.3
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 50
  • Score
    100M100P100Q95024F
  • License MIT

Expose members loader module for webpack

Package Exports

  • expose-members-loader

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (expose-members-loader) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

Expose Members loader for webpack

Inspiration

I was using the Expose loader for webpack, because I simply needed to expose some of the variables of legacy code (now served with Webpack and adapted to an ES6 approach) to the window scope.

Rapidly I realized that needed to use the Exports loader together with the Expose loader for webpack, until I reached the point where by exporting several members of a module, I needed to declared all of them individually to the global scope.

Like:

import 'expose-members?mySpace.functionA,mySpace.functionB,objectA!exports?functionA,functionB,objectA!imports?Something=>window.something!legacy/javascript/app';

Of course I could have done twice or more the same import using only one default exports together with an expose, like:

import 'expose-members?mySpace.functionA!exports?functionA!legacy/javascript/app';
import 'expose-members?mySpace.functionB!exports?functionB!legacy/javascript/app';
import 'expose-members?objectA!exports?objectA!legacy/javascript/app';

But that's not exactly the proper way to solve it. So decided to extend the original Expose loader for webpack.

Feel free to give feedback.

Usage

require("expose-members?memberA,memberB!./file.js");
// Exposes the export members for file.js to the global context on properties "memberA" and "memberB".
// In web browsers, window.memberA and window.memberB is then available.

This line works to expose React.PropTypes to the web browser:

require("expose-members?PropTypes!react");

Thus, window.PropTypes is then available to any extension that wants to use it.

Alternately, you can set this in your config file:

module: {
  loaders: [
    { test: require.resolve("react"), loader: "expose-members?PropTypes" }
  ]
}

Also for multiple expose you can use ! in loader string:

module: {
  loaders: [
    { test: require.resolve("myModule"), loader: "expose-members?memberA2,memberB2!expose-members?memberA1,memberB1" },
  ]
}

You could also namespace the exposers you want like follows:

module: {
  loaders: [
    { test: require.resolve("react"), loader: "expose-members?myNamespace.memberA,myNamespace.memberB" }
  ]
}

The require.resolve is a node.js call (unrelated to require.resolve in webpack processing -- check the node.js docs instead). require.resolve gives you the absolute path to the module ("/.../app/node_modules/react/react.js"). So the expose only applies to the react module. And it's only exposed when used in the bundle.

Documentation: Imports in ES6

Documentation: Using loaders

License

MIT (http://www.opensource.org/licenses/mit-license.php)