-
-
Notifications
You must be signed in to change notification settings - Fork 36
Debugging missing modules
Finally, here are a few tips if some module is missing, which invariably happens sooner or later.
This one is usually not related to AureliaPlugin
.
If you get a red error from webpack at build-time that says it can't resolve a module, look at the module name, look at where you'd expect it to be found, look at your webpack config. "Classical" webpack debugging hints apply.
If the application is not working at runtime, try to break on all exceptions.
It usually ends up on aurelia-loader
throwing an exception because it can't find a module.
Remember which ID it can't load and start investigating.
If you run webpack --display-modules
it will display all included modules in its output, with (first) their runtime module id and (second) the file that it resolved to.
The first question you should ask yourself: "is the file in the bundle with an incorrect id or is it missing completely?".
Most of the time it is completely missing. Ask yourself why/where it should have been included. What code has a dependency on it?
- If it's in your code you probably lack a
PLATFORM.moduleName()
somewhere. - If it's in a library, then it probably doesn't use
moduleName
. You can easily fix this withModuleDependenciesPlugin
(see Managing dependencies).
If the file is there but doesn't have the correct id, it gets more complicated.
- Be sure to require the file with
PLATFORM.moduleName()
or someaurelia-webpack-plugin
facilities. If it was included because it is a staticimport
dependency of another module, its name won't be preserved and you'll end up with an integer id. - If you're sure it was included by
AureliaPlugin
but the id is still an integer, this is usually because the plugin could not normalize the module name. In particular, only files inside your webpackresolve.module
folders can be normalized. Don't build relative paths outside of those (e.g./../../something
from/src
). See below for a tip to use modules outside your application root. - If the module name is a string but not the correct/expected path, then something weird is going on.
Let's say you want to use files that are not inside your application src
folder and that are not imported modules (node_modules
) either.
For example: you are developing an aurelia library (in src
) and you want to add an example app under example
, that references your plugin.
In this case, you'll have resolve.modules = ['example', 'node_modules']
since your application is in example
and it uses 3rd party libraries.
The problem is, as mentionned previously, that references outside resolve.modules
(e.g. in src
) won't load properly at runtime. AureliaPlugin
supports using aliases to other locations. Set up resolve.alias = { 'my-lib': path.resolve('src') }
and now you can start referring to your module in src
from the example app, like so: PLATFORM.moduleName('my-lib/some-file')
.
A last gotcha is that your library is most likely a webpack plugin, and you expect a plain my-lib
to resolve to src/index
. To achieve this you can add an alias my-lib$
. The trailing $
means exact match to webpack.
In summary, your webpack config will look like this:
module.exports = {
// ...
resolve: {
modules: ['example', 'node_modules'],
alias: {
'my-lib': path.resolve('src'),
'my-lib$': path.resolve('src/index.js'),
}
}
};
And you can then use your plugin with:
aurelia.use.plugin(PLATFORM.moduleName('my-lib'));