前置知识

构建目标

vue-cli 构建目标

当你运行vue-cli-service build时,你可以通过—target选项指定不同的构建目标。它允许你将相同的源代码根据不同的用例生成不同的构建。

注意对 Vue 的依赖 在库模式中,Vue 是外置的。这意味着包中不会有 Vue,即便你在代码中导入了 Vue。如果这个库会通过一个打包器使用,它将尝试通过打包器以依赖的方式加载 Vue;否则就会回退到一个全局的Vue变量。 要避免此行为,可以在build命令中添加—inline-vue标志。 vue-cli-service build --target lib --inline-vue

你可以通过下面的命令将一个单独的入口构建为一个库:

  1. vue-cli-service build --target lib --name myLib [entry]
  2. File Size Gzipped
  3. dist/myLib.umd.min.js 13.28 kb 8.42 kb
  4. dist/myLib.umd.js 20.95 kb 10.22 kb
  5. dist/myLib.common.js 20.57 kb 10.09 kb
  6. dist/myLib.css 0.33 kb 0.23 kb

这个入口可以是一个.js或一个.vue文件。如果没有指定入口,则会使用src/App.vue。
构建一个库会输出:

  • dist/myLib.common.js:一个给打包器用的 CommonJS 包 (不幸的是,webpack 目前还并没有支持 ES modules 输出格式的包)
  • dist/myLib.umd.js:一个直接给浏览器或 AMD loader 使用的 UMD 包
  • dist/myLib.umd.min.js:压缩后的 UMD 构建版本
  • dist/myLib.css:提取出来的 CSS 文件 (可以通过在vue.config.js中设置css: { extract: false }强制内联)

    警告 如果你在开发一个库或多项目仓库 (monorepo),请注意导入 CSS是具有副作用的。请确保在package.json中移除“sideEffects”: false,否则 CSS 代码块会在生产环境构建时被 webpack 丢掉。

配置文件

vue.config.js

  1. const path = require("path");
  2. module.exports = {
  3. pages: {
  4. index: {
  5. entry: "examples/main.js",
  6. template: "public/index.html",
  7. filename: "index.html",
  8. },
  9. },
  10. //拓展 webpack 配置,使 package 加入编译
  11. chainWebpack: (config) => {
  12. config.module
  13. .rule("js")
  14. .include.add(path.resolve(__dirname, "packages"))
  15. .end()
  16. .use("babel")
  17. .loader("babel-loader")
  18. .tap((options) => {
  19. //修改它的选项
  20. return options;
  21. });
  22. },
  23. };

package.json

  1. {
  2. "name": "chu-ui",
  3. "version": "0.1.0",
  4. "private": false,
  5. "main": "dist/chu-ui.umd.min.js", //注意此处需要修改
  6. "author": {
  7. "name": "chu"
  8. },
  9. "scripts": {
  10. "serve": "vue-cli-service serve",
  11. "build": "vue-cli-service build",
  12. "lib": "vue-cli-service build --target lib packages/index.js" //打包库命令
  13. },
  14. "dependencies": {
  15. "core-js": "^3.6.5",
  16. "vue": "^2.6.11"
  17. },
  18. "devDependencies": {
  19. "@vue/cli-plugin-babel": "~4.5.0",
  20. "@vue/cli-service": "~4.5.0",
  21. "sass": "^1.26.5",
  22. "sass-loader": "^8.0.2",
  23. "vue-template-compiler": "^2.6.11"
  24. }
  25. }

.npmignore

  1. #忽略目录
  2. examples/
  3. packages/
  4. public/
  5. #忽略指定文件
  6. vue.config.js
  7. babel.config.js
  8. *.map

入口文件

  1. //整个包的入口
  2. //定义install方法 接收Vue作为参数,如果使用use注册插件,则所有的组件都将被注册
  3. import Button from "./button";
  4. import Dialog from "./dialog";
  5. import Input from "./input";
  6. import Checkbox from "./checkbox";
  7. import Radio from "./radio";
  8. import RadioGroup from "./radio-group";
  9. import Switch from "./switch";
  10. import CheckboxGroup from "./checkbox-group";
  11. import Form from "./form";
  12. import FormItem from "./form-item";
  13. import "./fonts/font.scss";
  14. const components = [
  15. Button,
  16. Dialog,
  17. Input,
  18. Checkbox,
  19. Radio,
  20. RadioGroup,
  21. Switch,
  22. CheckboxGroup,
  23. Form,
  24. FormItem,
  25. ];
  26. const install = function(Vue) {
  27. //遍历注册全局组件
  28. components.forEach((component) => {
  29. Vue.component(component.name, component);
  30. });
  31. };
  32. //判断是否是直接引入文件,如果是,就不用调用 Vue.use()
  33. if (typeof window !== "undefined" && window.Vue) {
  34. install(window.Vue)
  35. }
  36. export default {
  37. install,
  38. };

最佳实践

切换源为 npm

  1. nrm ls
  2. nrm use npm

登录

  1. npm login

发布

  1. npm publish

注意事项

  • 报错1:发布时报错:npm ERR! no_perms Private mode enable, only admin can publish this module:

解决:修改自己的发布源(需要重新登录)

  1. npm config set registry http://registry.npmjs.org

删除包

  1. npx force-unpublish package-name '原因描述'

来源:npm Force Unpublish

注意:24小时内可操作。


https://blog.csdn.net/qq_39009348/article/details/104027678
https://www.cnblogs.com/yalong/p/10388384.html
https://juejin.im/post/6844904111133966344#heading-0
https://juejin.im/post/6844903636808499214#heading-0