Webpack provides the example below in its shimming documentation. In the global exports portion of that page, it gives the following example.
webpack.config.js
module.exports = {
module: {
rules: [
{
test: require.resolve('globals.js'),
use: exports-loader?file,parse=helpers.parse
}
]
}
}
./src/globals.js
var file = 'blah.txt';
var helpers = {
test: function() { console.log('test something'); },
parse: function() { console.log('parse something'); }
};
But when I attempt to build, I get:
ERROR in ./webpack.config.js
Module not found: Error: Can't resolve 'globals.js' in '/workspace/my-app'
Why is globals.js
not resolving, and why does the example in their documentation assume it will? Am I missing something? Thanks.
exports-loader
configurationI have this working with the following setup:
src/deps.js // this file just declare a global file
variable
const file = 'this is the file';
src/app.js // entry point of the webpack bundle. It import
's deps.js
(even if deps.js
does not have an export
statement, thanks to export-loader
):
import file from './deps.js'
console.log(file);
webpack.config.js // webpack configuration file
module.exports = {
entry: __dirname + '/src/app.js',
mode: 'development',
module: {
rules: [
{
test: /deps.js/,
use: 'exports-loader?file',
}
]
}
}
package.json // so we can run webpack locally to the project
{
"name": "exports-loader-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"webpack": "node_modules/webpack/bin/webpack.js"
},
"author": "",
"license": "ISC",
"devDependencies": {
"exports-loader": "^0.7.0",
"webpack": "^4.29.6",
"webpack-cli": "^3.2.3"
}
}
With this setup, assuming webpack.config.js
, package.json
and src/
are in the root of the project, do:
$ npm run webpack
To bundle the scripts, then:
$ node dist/main.js
to check that the file
variable is being loaded (to load this in a browser will do the same).
import
specific configuration.(this comes from this other answer).
In order to do so, you need to use
just the exports-loader
, without any further configuration when you load it in the webpack.config.js
:
use: 'exports-loader',
And then specify the variables to wrap in an export
clause in every import
statement:
import file from 'exports-loader?file!./deps.js'
require.resolve()
syntax is not working?I really don't know. The test
clause expects a regex as far as I know (that's why it is called test
in fact, because of the test
method of regex's in javascript) and I'm not used to other kind of valid syntaxes. I see that in your snippet:
module.exports = {
module: {
rules: [
{
test: require.resolve('globals.js'),
use: exports-loader?file,parse=helpers.parse
}
]
}
}
The use
value does not have string quotes. I wonder if this is broking the config and then you get a misleading error, I don't know. I actually believe you just didn't paste the quotes when copy and pasting to stack overflow.