Vue 组件库 - 无法从 dist 导入

Posted

技术标签:

【中文标题】Vue 组件库 - 无法从 dist 导入【英文标题】:Vue Component Library - Can't import from dist 【发布时间】:2019-11-01 16:19:56 【问题描述】:

几天来,我一直在尝试设置 Vue 组件库。我查看了几个教程并阅读了一些流行的现有 UI 库的代码。我的问题归结为:

我的库叫做@company/vue-components

我使用 npm 将我的库安装到一个项目中:

npm install @company/vue-components

然后我尝试将我的库注册为 Vue 的插件:

import Vue from 'vue';
import VueComponents from '@company/vue-components';

Vue.use(VueComponents);

我尝试在 vue-cli 生成的 About.vue 页面中使用我的组件(称为 EButton):

<template>
    <div class="about">
        <h1>This is an about page</h1>
        <e-button color="primary">Click this button</e-button>
    </div>
</template>

<script>
export default 
;
</script>

但我得到一个错误:

[Vue warn]: Unknown custom element: <e-button> - did you register the component correctly? For recursive components, make sure to provide the "name" option

如果我回到我注册插件的地方,我可以进行这一更改,它会起作用:

import VueComponents from '@company/vue-components/src/index';

所以,我想我没有正确构建我的 dist 包,因为这是我简单地使用“@company/vue-components”时引用的内容。如果我在控制台中打印每个变量,我可以看到分发包的导入不包含“安装”功能,但源导入包含:

这是我能想到的所有相关源代码。这是使用 vue-sfc-rollup cli 工具和复制 Buefy 库设置的混搭。

EButton.vue

<template>
    <button class="button" v-bind="$attrs" v-on="$listeners">
        <slot></slot>
    </button>
</template>

<script>
export default 
    name: 'EButton',
    inheritAttrs: false
;
</script>

EButton/index.js

import EButton from './EButton.vue';

const Plugin = 
    install(Vue) 
        Vue.component(EButton.name, EButton);
    
;

let GlobalVue = null;

if (typeof window !== 'undefined') 
    GlobalVue = window.Vue;

else if (typeof global !== 'undefined') 
    GlobalVue = global.Vue;


if (GlobalVue) 
    GlobalVue.use(Plugin);


export default Plugin;

export 
    EButton
;

组件/index.js

import EButton from './EButton';

export 
    EButton
;

src/index.js

import * as components from './components/index.js';

const install = function(Vue) 
    if (install.installed) 
        return;
    
    install.installed = true;

    for (let name in components) 
        Vue.use(components[name]);
    
;

const Plugin =  install ;

let GlobalVue = null;

if (typeof window !== 'undefined') 
    GlobalVue = window.Vue;

else if (typeof global !== 'undefined') 
    GlobalVue = global.Vue;


if (GlobalVue) 
    GlobalVue.use(Plugin);


export default Plugin;

rollup.config.js

import vue from 'rollup-plugin-vue';
import buble from 'rollup-plugin-buble';
import commonjs from 'rollup-plugin-commonjs';
import replace from 'rollup-plugin-replace';
import  terser  from 'rollup-plugin-terser';
import minimist from 'minimist';

const argv = minimist(process.argv.slice(2));

const baseConfig = 
    input: 'src/index.js',
    plugins: 
        preVue: [
            replace(
                'process.env.NODE_ENV': JSON.stringify('production')
            ),
            commonjs()
        ],
        vue: 
            css: true,
            template: 
                isProduction: true
            
        ,
        postVue: [
            buble()
        ]
    
;

const external = [
];

const globals = 
;

const buildFormats = [];

if (!argv.format || argv.format === 'es') 
    const esConfig = 
        ...baseConfig,
        external,
        output: 
            file: 'dist/vue-components.esm.js',
            format: 'esm',
            exports: 'named',
            globals
        ,
        plugins: [
            ...baseConfig.plugins.preVue,
            vue(baseConfig.plugins.vue),
            ...baseConfig.plugins.postVue,
            terser(
                output: 
                    ecma: 6
                
            )
        ]
    ;

    buildFormats.push(esConfig);


if (!argv.format || argv.format === 'cjs') 
    const umdConfig = 
        ...baseConfig,
        external,
        output: 
            compact: true,
            file: 'dist/vue-components.s-s-r.js',
            format: 'cjs',
            name: 'VueComponents',
            exports: 'named',
            globals,
        ,
        plugins: [
            ...baseConfig.plugins.preVue,
            vue(
                ...baseConfig.plugins.vue,
                template: 
                    ...baseConfig.plugins.vue.template,
                    optimizes-s-r: true
                
            ),
            ...baseConfig.plugins.postVue
        ]
    ;

    buildFormats.push(umdConfig);


if (!argv.format || argv.format === 'iife') 
    const unpkgConfig = 
        ...baseConfig,
        external,
        output: 
            compact: true,
            file: 'dist/vue-components.min.js',
            format: 'iife',
            name: 'VueComponents',
            exports: 'named',
            globals,
        ,
        plugins: [
            ...baseConfig.plugins.preVue,
            vue(baseConfig.plugins.vue),
            ...baseConfig.plugins.postVue,
            terser(
                output: 
                    ecma: 5
                
            )
        ]
    ;

    buildFormats.push(unpkgConfig);


export default buildFormats;

package.json


  "name": "@company/vue-components",
  "version": "1.0.0",
  "description": "",

  "main": "dist/vue-components.s-s-r.js",
  "module": "dist/vue-components.esm.js",
  "unpkg": "dist/vue-components.min.js",

  "files": [
    "dist/*",
    "src/**/*.vue",
    "!src/lib-dev.vue"
  ],

  "scripts": 
    "build": "cross-env NODE_ENV=production rollup --config build/rollup.config.js",
    "build:s-s-r": "cross-env NODE_ENV=production rollup --config build/rollup.config.js --format cjs",
    "build:es": "cross-env NODE_ENV=production rollup --config build/rollup.config.js --format es",
    "build:unpkg": "cross-env NODE_ENV=production rollup --config build/rollup.config.js --format iife"
  ,
  ...

【问题讨论】:

您的组件库package.json 中的main 条目是什么?例如,这里是 Vuex 包~github.com/vuejs/vuex/blob/dev/package.json#L5 很抱歉。我已经添加了 package.json 信息 【参考方案1】:

在尝试处理这个问题几周后,我最终使用 Vue CLI 工具重新开始了这个项目。使用 vue-cli-service build 命令构建了我需要的库。完整的命令:

vue-cli-service build --no-clean --target lib --name vue-components src/index.js

src/index.js 与我上面的帖子没有变化

【讨论】:

以上是关于Vue 组件库 - 无法从 dist 导入的主要内容,如果未能解决你的问题,请参考以下文章

从 CDN 库动态加载 vue 组件

无法从 npm 包中导入 vue 组件

如何将库导入vue组件?

将 Vue 组件库发布到 npm

将 Vue 组件库发布到 npm

Vue组件库发布到npm详解