Как опубликовать плагин Vue в NPM? - PullRequest
0 голосов
/ 27 февраля 2019

Я написал очень простой плагин для Voca.js от Typescript.Вы можете найти исходный код здесь .

index.ts

import VueVoca from './vue-voca';
export {
    VueVoca
};

vue-voca.ts

import vue from 'vue';

export default {
  install(Vue: typeof vue) {
    Vue.prototype.$voca = require('voca');
  }
};

vue.d.ts

import Vue from 'vue';
import vc from 'voca';
declare module 'vue/types/vue' {
  export interface Vue {
    $voca: vc.VocaStatic;
  }
}

Для создания пакета npm я использую эту команду

vue-cli-service build --name vue-voca --entry ./src/index.ts --target lib и npm pack.

package.json

{
  "name": "vue-voca",
  "version": "1.0.0",
  "private": false,
  "scripts": {
    "serve": "vue-cli-service serve ./example/main.ts --open",
    "build": "vue-cli-service build --name vue-voca --entry ./src/index.ts --target lib",
    "prepublishOnly": "npm run build"
  },
  "dependencies": {
    "@types/voca": "^1.4.0",
    "voca": "^1.4.0",
    "vue": "^2.6.7"
  },
  "devDependencies": {
    "@vue/cli-plugin-typescript": "^3.4.1",
    "@vue/cli-service": "^3.4.1",
    "fibers": "^3.1.1",
    "sass": "^1.17.2",
    "sass-loader": "^7.1.0",
    "typescript": "^3.3.3333",
    "vue-cli-plugin-component": "^1.10.5",
    "vue-template-compiler": "^2.6.7"
  },
  "files": [
    "dist/*.css",
    "dist/*.map",
    "dist/*.js",
    "src/*"
  ],
  "keywords": [
    "vue",
    "component"
  ],
  "types": "src/vue.d.ts",
  "typings": "src/vue.d.ts",
  "main": "dist/vue-services.umd.js",
  "module": "dist/vue-services.common.js"
}

tsconfig

{
  "compilerOptions": {
    "target": "es5",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "declaration": true,  
    "importHelpers": true,
    "moduleResolution": "node",
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "types": [
      "webpack-env"
    ],
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx"
  ],
  "exclude": [
    "node_modules"
  ]
}

Но после использования пакета npm в другом проекте яполучил ошибку.VueVoca не распознает и Typescript не может работать с ним хорошо.

enter image description here

enter image description here

enter image description here

enter image description here

webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:620 [Vue warn]: Error in render: "TypeError: Cannot read property 'swapCase' of undefined"

found in

---> <HelloWorld> at src/components/HelloWorld.vue
       <App> at src/App.vue
         <Root>

Может кто-нибудь помочь мне написать правильный плагин с правильным пакетом npm?

1 Ответ

0 голосов
/ 27 февраля 2019

Проблема в том, что вы написали свой плагин на TypeScript.Таким образом, как минимум, существует два определения типов:

  • index.d.ts - Содержит определения типов для файла index.ts после компиляции
  • vue.d.ts - Содержит код расширения модуля Vue.js для плагина Vue.

Теперь ваше поле package.json имеет types/typings, указывающее на vue.d.ts.Для TypeScript, когда эта библиотека импортируется, она выводит код дополнения модуля.Его никогда не найти в index.d.ts файле.Итак, в вашем компоненте Vue this.$voca() будет работать с TS, но не с import { VueCoca } from 'vue-coca';

. В качестве решения установите для поля types значение <PATH>/index.d.ts file.Кроме того, для краткости переименуйте vue.d.ts в augment.d.ts.Вызывающий эту библиотеку затем должен написать свой собственный файл набора текста - * .d.ts файл, куда он будет импортировать этот файл, например:

import 'vue-coca/<PATH>/augment.d';

В качестве альтернативы, вы также можете импортировать это дополнениефайл внутри основного файла index.ts вашего плагина.При таком подходе пользователям этой библиотеки не нужно будет включать ее отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...