Skip to content

Commit 76b7178

Browse files
committed
Initial commit.
0 parents  commit 76b7178

File tree

4 files changed

+111
-0
lines changed

4 files changed

+111
-0
lines changed

README.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# requirejs-loader
2+
3+
Allows the import of requirejs packages through the browser.
4+
5+
This is specifically useful for Magento 2, which extensively uses requirejs.
6+
7+
## Usage
8+
9+
const RequireJsLoaderPlugin = require('@sdinteractive/requirejs-loader').RequireJsLoaderPlugin;
10+
11+
module.exports = {
12+
module: {
13+
rules: [
14+
{
15+
test: /require.*\.js$/,
16+
use: [
17+
{ loader: '@sdinteractive/requirejs-loader' },
18+
],
19+
}
20+
]
21+
},
22+
23+
plugins: [
24+
new RequireJsLoaderPlugin(),
25+
],
26+
};

RequireJsLoaderPlugin.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
'use strict';
2+
3+
const ConcatSource = require('webpack-sources').ConcatSource;
4+
5+
let RequireJsLoaderPlugin = function() {
6+
};
7+
8+
function gatherRequireJsImports(modules) {
9+
let needsImport = [];
10+
for (var module of modules) {
11+
// If the requirejs-loader was used, then we need to wrap and import this module.
12+
// TODO: Clean up this check.
13+
if (module.request && module.request.indexOf('requirejs-loader') !== -1) {
14+
needsImport.push(module.rawRequest);
15+
}
16+
}
17+
18+
return needsImport;
19+
}
20+
21+
function generateProlog(imports) {
22+
const jsonImports = JSON.stringify(imports);
23+
return `window.require(${jsonImports}, function() {`;
24+
}
25+
26+
function generateEpilog(imports) {
27+
return `});`;
28+
}
29+
30+
RequireJsLoaderPlugin.prototype.apply = function(compiler) {
31+
compiler.plugin('compilation', (compilation, data) => {
32+
compilation.plugin('chunk-asset', (chunk, filename) => {
33+
const needsImport = gatherRequireJsImports(chunk.modules);
34+
if (needsImport.length != 0) {
35+
let prolog = generateProlog(needsImport);
36+
let epilog = generateEpilog(needsImport);
37+
38+
compilation.assets[filename] = new ConcatSource(prolog, "\n", compilation.assets[filename], "\n", epilog);
39+
}
40+
});
41+
});
42+
};
43+
44+
module.exports = RequireJsLoaderPlugin;

index.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
'use strict';
2+
3+
const path = require('path');
4+
const ConcatSource = require('webpack-sources').ConcatSource;
5+
6+
module.exports = function() {
7+
};
8+
9+
module.exports.pitch = function(remainingRequest) {
10+
this.cacheable && this.cacheable();
11+
12+
// Route through window.require.
13+
// TODO: We use rawRequest to grab the original request (including text! or etc.)
14+
const jsonName = JSON.stringify(this._module.rawRequest);
15+
return `module.exports = window.require(${jsonName});`;
16+
};
17+
18+
module.exports.RequireJsLoaderPlugin = require('./RequireJsLoaderPlugin.js');

package.json

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"name": "@sdinteractive/requirejs-loader",
3+
"version": "1.0.0",
4+
"description": "webpack loader to import requirejs browser published modules.",
5+
"main": "index.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1"
8+
},
9+
"repository": {
10+
"type": "git",
11+
"url": "https://github.com/sdinteractive/webpack-requirejs-loader.git"
12+
},
13+
"keywords": [
14+
"webpack",
15+
"requirejs"
16+
],
17+
"author": "Something Digital",
18+
"license": "ISC",
19+
"bugs": {
20+
"url": "https://github.com/sdinteractive/webpack-requirejs-loader/issues"
21+
},
22+
"homepage": "https://github.com/sdinteractive/webpack-requirejs-loader#readme"
23+
}

0 commit comments

Comments
 (0)