I create a web component with vue-cli.3 in order to use it in other projects with the following command:
vue-cli-service build --target lib --name helloworld ./src/components/HelloWorld.vue
The component has a dependency on lodash. I don't want to bundle lodash with the component because lodash is going to be provided by the host application, so I configure webpack in vue.config.js like below:
module.exports = {
configureWebpack: {
externals: {
lodash: 'lodash',
root: '_'
}
}
}
So this way, I successfully compile the component without lodash.
In the host application (the one that will use the component), I add the source path of the newly created and compiled component into index.html:
<script src="http://localhost:8080/helloworld.umd.js"></script>
Register the component in App.vue:
<template>
<div id="app">
<demo msg="hello from my component"></demo>
</div>
</template>
<script>
export default {
name: "app",
components: {
demo: helloworld
}
};
</script>
The helloworld component renders without problems. Every feature of the component works without problems but as soon as I call a method of lodash, I get;
Uncaught TypeError: Cannot read property 'camelCase' of undefined
which means the component cannot access the lodash library that the host application uses.
I need to find a way to use the already bundled libraries in the host application from the components.
Is there a way?
externalsset up incorrectly. You need your externals object set up like this:externals: { lodash: { root: '_' } }.I don't think you really have a dependency calledrootthat you want to be exposed as_:plodash, ensurelodashis listed underpeerDependenciesin yourpackage.json.package.jsonof your library: docs.npmjs.com/files/package.json.html#peerdependencies, yarnpkg.com/lang/en/docs/dependency-types/#toc-peerdependencies. Since you're not installing your package via npm, yarn, .etc. then it technically won't make a difference.