当前位置: 首页 > 知识库问答 >
问题:

Vue Typescript组件库-使用Webpack和SASS

盖晋
2023-03-14

我目前正在为一家公司构建一个Vue UI组件库,在这个过程中,我使用webpack作为默认绑定程序。我想把整个项目构建成一个npm包,然后可以通过一个私有的git包存储库分发。包分发已经启动并运行,但我似乎无法以正确的方式导出组件,以便在另一个项目中使用。

使用的不同工具的版本:

国家预防机制:6.14.4

节点:12.17.0

纱线:1.22.0

@VUE/CLI:4.4.1

TSC:3.9.5

项目结构如下:

public
src
 - assets
  | - css
  |  | - tailwind.css
  | - fonts
  |  | - stylesheet.css
 - component
  | - LbButton
  |  | - LbButton.vue
  |  | - index.ts
  | - Lbtag
  |  | - LbTag.vue
  |  | - index.ts
  | - ...
 - theme
  | - index.ts
  | - Theme.ts
 - typedefs
  | - types.ts
  | - events.ts
  | - model.ts
  | - states.ts
 - views
  | - Home.vue
 - App.vue
 - index.ts
 - main.ts
 - plugin.ts
 - shims-vue.d.ts
vue.config.js
tailwind.config.js
tsconfig.json
postcss.config.js
babel.config.js
package.json

当前设置包含以下配置:

package.json

  ...
  "main": "./dist/@livebackend/ui.common.js",
  ...
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build --target lib --name @livebackend/ui src/index.ts ",
    "test:unit": "vue-cli-service test:unit"
  },
  "files": [
    "dist/*",
    "src/*",
    "public/*",
    "*.json",
    "*.vue",
    "*.ts",
    "*.js"
  ],
  "dependencies": {
    "@kazupon/vue-i18n-loader": "^0.5.0",
    "@types/lodash": "^4.14.152",
    "@types/vue-i18n": "^7.0.0",
    "@types/vue-select": "^2.5.0",
    "core-js": "^3.6.4",
    "date-fns": "^2.14.0",
    "lodash": "^4.17.15",
    "v-calendar": "^1.0.6",
    "vue": "^2.6.11",
    "vue-class-component": "^7.2.3",
    "vue-i18n": "^8.18.1",
    "vue-infinite-loading": "^2.4.5",
    "vue-property-decorator": "^8.4.1",
    "vue-select": "^3.10.3",
    "vuex": "^3.1.3",
    "vuex-class": "^0.3.2"
  },
  "peerDependencies": {
    "@vue/composition-api": "^0.6.7"
  },
  "devDependencies": {
    "@types/chai": "^4.2.11",
    "@types/mocha": "^5.2.4",
    "@vue/cli-plugin-babel": "~4.3.0",
    "@vue/cli-plugin-typescript": "~4.3.0",
    "@vue/cli-plugin-unit-mocha": "~4.3.0",
    "@vue/cli-plugin-vuex": "~4.3.0",
    "@vue/cli-service": "~4.3.0",
    "@vue/composition-api": "^0.6.7",
    "@vue/test-utils": "1.0.0-beta.31",
    "chai": "^4.1.2",
    "node-sass": "^4.14.1",
    "sass": "^1.26.5",
    "sass-loader": "^8.0.2",
    "style-loader": "^1.2.1",
    "tailwindcss": "1.4.6",
    "ts-loader": "^7.0.5",
    "typescript": "~3.9.5",
    "vue-style-loader": "^4.1.2",
    "vue-template-compiler": "^2.6.11"
  },
  "version": "0.4.8"
}

TSCONFIG

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

vue.config.js

module.exports = {
  publicPath: "./src",
  devServer: {
    proxy: "http://localhost:3000"
  },
  chainWebpack: config => {
    config.plugins.delete("optimize-css");
  },
  configureWebpack: {
    module: {
      rules: [
        {
          resourceQuery: /blockType=i18n/,
          type: "javascript/auto",
          loader: "@kazupon/vue-i18n-loader"
        }
      ]
    }
  }
};

tailwind.config.js

const settings = {
  theme: {},
  variants: {},
  plugins: []
};

if (process.env.NODE_ENV === "production") {
  settings.purge = ["./src/**/*.html", "./src/**/*.vue", "./src/**/*.jsx"];
}

module.exports = settings;

src/index.ts

export { default as Theme } from "./theme";
export { default as LbButton } from "./components/lbButton";
export { default as LbInputField } from "./components/lbInputField";
export { default as LbIconButton } from "./components/lbIconButton";
export { default as LbTag } from "./components/lbTag";
export { default as LbCard } from "./components/lbCard";
export { default as LbFB } from "./components/lbFB";
export { default as LbDatePicker } from "./components/lbDatePicker";
export { default as LbRadio } from "./components/lbRadio";
export { default as LbLoading } from "./components/lbLoading";
export { default as LbSlider } from "./components/lbSlider";
export { default as LbSwitch } from "./components/lbSwitch";
export { default as LbTable } from "./components/lbTable";
import plugin from "./plugin";
export default plugin; 

Main.TS

import Vue from "vue";
import VueI18n from "vue-i18n";
import vSelect from "vue-select";
import VCalendar from "v-calendar";
import "@/assets/css/tailwind.css";
import "@/assets/fonts/stylesheet.css";
import "vue-select/dist/vue-select.css";
import InfiniteLoading from "vue-infinite-loading";

import App from "./App.vue";
import messages from "./tranlations";

Vue.config.productionTip = false;

Vue.component("v-select", vSelect);
Vue.use(VCalendar, {
  componentPrefix: "v" 
});
Vue.use(VueI18n);
Vue.use(InfiniteLoading);

const i18n = new VueI18n({
  locale: "en",
  messages
});

new Vue({
  i18n,
  render: h => h(App)
}).$mount("#app");

如果我需要张贴更多的文件,请不要犹豫问。当我将所有这些捆绑起来并将其包含在一个项目中(如import{LbButton}from“@LiveBackend/UI”)时,我得到一个错误,告诉我vue找不到类型声明或模块。然后,当我尝试从“@livebackend/ui/src”导入它时,我得到另一个错误,告诉我vue无法理解“@”的含义。我使用“@”来查找项目中的相关模块。

有没有人以前有过这些问题?

共有1个答案

宗政斌
2023-03-14

我也在搜索同样的信息,并发现了这个问题,我尝试了许多repo和博客/教程和https://github.com/team-innovation/vue-sfc-rollup是我目前发现的最好的解决方案,但我会更新这个答案,一旦我使用它的时间更长。我昨天刚刚开始,我把功能一个接一个地放在那里,看看我是否击中了什么。

编辑:2.2020年11月份

我不得不把

configureWebpack: {
  resolve: {
      alias: {
        vue: path.resolve("./node_modules/vue")
      }
    }
}

要解决问题[Vue warn]:$Listeners是只读的。

参考:https://github.com/team-innovation/vue-sfc-rollup/issues/26

 类似资料:
  • 问题内容: 我在玩和使用和。我想在不同的文件中构建多个组件,将其导入单个文件并将其捆绑在一起 假设我有几个这样的组件: my-navbar.jsx main-page.jsx 使用webpack并按照其教程进行操作,我有: 构建项目并运行它之后,在浏览器控制台中出现以下错误: 我究竟做错了什么?如何正确导入和导出组件? 问题答案: 尝试 默认设置 组件中的导出: 通过使用默认值,您表示将成为该模块

  • 设置和使用 使用webpack的最常见方法是通过CLI。默认情况下,运行命令会执行,这是webpack设置的配置文件。 webpack的核心概念是bundle。 bundle是一个简单的模块集合,我们定义它们如何分离的边界。 在这个项目中,我们有两个包: app 为我们的应用程序特定的客户端逻辑 第三方库的vendor 在webpack中,通过入口点配置bundle。 Webpack逐个遍历每个入

  • 问题内容: 我正在升级旧版web2py(python)应用程序以使用react组件。我正在使用webpack将jsx文件转换为缩小的js包。我希望能够使用: 捆绑软件中包含ComponentA,而web2py视图中包括了捆绑软件。问题是我无法在视图中访问ComponentA。以下示例将起作用: 我看了exports-loader和webpack-add-module- exports, 但还没有开

  • ActiveX 组件是建立强大的 Web 应用程序的关键。组件提供了用在脚本中执行任务的对象。ASP 同样提供了可在脚本中使用的内建对象。本主题将讨论如何使用组件提供的对象以及由 Active Server Pages 直接提供的内建对象。 关于组件 ActiveX 组件是一个文件,该文件包含执行某项或一组任务的代码。组件可以执行公用任务,这样就不必自己去创建执行这些任务的代码。例如,股票行情收报

  • 本文向大家介绍Python QT组件库qtwidgets的使用,包括了Python QT组件库qtwidgets的使用的使用技巧和注意事项,需要的朋友参考一下 虽然Qt提供了不少现成的组件,但是在Python中使用PyQt5或PySide2进行图形界面程序开发的过程,还是免不了要根据自己的需求组合一些小部件以形成新的自定义组件。 最近州的先生在写一个桌面图形界面的登录密码框的过程中,发现了这样一个

  • 我试图在一个TypeScript项目中使用带有Webpack2的Globalize库。typescript/Webpack 2安装程序已经运行,但是,在导入和访问Globalize时,我在运行Webpack时收到以下错误消息: 因此,我尝试安装的global类型: 现在我得到以下错误: 不出所料,这对我来说都是非常新的。不知道我是否应该检查网络包、打字、全球化或打字稿... 这是我的包裹。json