J'essaie d'exporter un composant Vue en tant que package et d'utiliser vue cli pour construire le dist. J'ai l'intention de le publier sur npm, mais j'utilise actuellement un lien symbolique à des fins de test. Cependant, même avec un simple projet hello-world, je ne peux pas créer de package valide.
J'ai créé un projet:
[Vue warn]: Failed to resolve async component: function MediaViewerPdf() { return Promise.all(/*! import() */[__webpack_require__.e(62), __webpack_require__.e(46)]).then(__webpack_require__.bind(null, /*! ./viewers/MediaViewerPdf.vue */ "./vuejs/components/mediaViewer/viewers/MediaViewerPdf.vue")); } Reason: ReferenceError: require is not defined
Ensuite, j'ai modifié le package.json:
import HelloWorld from "hello-world";
Ensuite, j'appelle
npm run build
et il compile sans erreur.
Ensuite, je fais une importation dans un composant vue dans un autre projet (j'ai utilisé un lien symbolique dans node_modules):
"scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build --target lib --name vue-hello-world ./src/components/HelloWorld.vue", "lint": "vue-cli-service lint" }, "main": "./dist/vue-hello-world.common.js",
Sur le rendu de la page, j'obtiens l'erreur suivante:
vue create hello-world
vue inspect
, j'ai vérifié que dans la configuration du pack Web: cible: "web"
EDIT: J'ai confirmé que cela ne venait pas du lien symbolique, j'ai exactement la même erreur avec le package directement sur node_modules.
Repo avec le code entier: https://github.com/louis-sanna/vue-hello-world p>
3 Réponses :
Vous ne savez pas comment vous créez le lien symbolique, mais vous devriez utiliser npm link
pour cela. Si vous rencontrez toujours des problèmes (comme je l'ai fait moi-même), je vous suggère d'essayer npm-link-better
:
npm install -g npm-link-better cd vue-hello-world npm link cd ../hello-world nlc -w vue-hello-world
Pour créer des bibliothèques de composants, je suggère que vous ayez un coup d'oeil à vue-cli-plugin-component . Ce plugin configure déjà assez bien le projet vue-cli.
Cela est dû au fait que la configuration de Vue CLI Webpack par défaut n'importe pas les modules commonjs, comme décrit dans votre champ "principal" dans package.json. Le problème vient donc du projet qui tente d’importer, pas du projet qui exporte le composant.
Il y a deux façons de tenter de résoudre ce problème.
Vous pouvez remédier à cela en installant des plugins babel pour le projet qui importe vos composants et en définissant babel.config.js
import 'hello-world/dist/vue-hello-world.css';
Mais faire cela seul ne suffira pas être suffisant: vous devrez également importer le CSS qui est généré avec la bibliothèque en l'ajoutant dans votre fichier d'entrée
module.exports = { presets: [ '@vue/app' ], plugins: [ '@babel/plugin-transform-modules-commonjs', // leave to import .common.js files '@babel/plugin-transform-modules-umd' // leave to import .umd.js files ] }
Notez que je n'ai testé cela qu'en utilisant le lien yarn, mais Je suis convaincu que cela fonctionnera très bien avec un module npm séparé importé.
L'intention (je suppose) de la question originale - comment regrouper une bibliothèque pour que mes utilisateurs n'aient pas à faire cette petite danse à chaque fois qu'ils veulent l'utiliser?
Option 1: ne le regroupez pas - fournissez les fichiers .vue et les sources. Incluez simplement tout dans le répertoire 'src' de votre module, écrivez un readme avec des explications et en avez terminé. Laissez le projet importateur comprendre la compilation et le regroupement.
Option 2: utiliser le rollup avec le plugin Vue pour regrouper les composants dans le bundle. Il y a un exemple sur la façon de faire cela. Dans cet exemple, vous pouvez voir que votre projet pourra importer une version .esm https://github.com/vuejs/rollup-plugin- vue / tree / master / cookbook / library
J'ai donc posé la question sur le repo vue-cli et j'ai eu la solution! https://github.com/vuejs/vue-cli/issues/4245
Il s'avère que NODE_ENV
était déjà défini lors du développement
dans mon shell, donc c'était le mode utilisé pour faire la construction.
Juste besoin pour définir le mode explicitement et cela fonctionne:
vue-cli-service build --target lib --name vue-hello-world ./src/components/HelloWorld.vue --mode production
Vous devrez peut-être l'ajouter à vue.config.js:
config .mode("production")
Vous avez donc créé ce composant et vous essayez de l'importer dans un autre projet Vue?
@ Josef7 Correct.
Essayez de regarder cette question , il semble que vous deviez ajouter des éléments à le package.json vue-hello-world, importez en tant que dépendance de développement dans l'autre projet et utilisez éventuellement
npm link
pour lier les packagesJ'utilise actuellement un lien symbolique à des fins de test, mais j'ai l'intention de le publier sur npm.
La question que vous avez posée ne correspond donc pas à mes besoins.