You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

229 lines
7.2 KiB

2 months ago
  1. <p align="center">
  2. <img src="https://github.com/vueuse/vue-demi/blob/main/assets/banner.png?raw=true" width="600"/>
  3. <br>
  4. <a href='https://www.npmjs.com/package/vue-demi'><img src='https://img.shields.io/npm/v/vue-demi?color=42b883' alt='npm'></a>
  5. </p>
  6. <p align="center">
  7. <b>Vue Demi</b> (<i>half</i> in French) is a developing utility<br> allows you to write <b>Universal Vue Libraries</b> for Vue 2 & 3<br>
  8. <i>See more details in <a href='https://antfu.me/posts/make-libraries-working-with-vue-2-and-3'>this blog post</a></i>
  9. </p>
  10. <br>
  11. <br>
  12. ## Strategies
  13. - `<=2.6`: exports from `vue` + `@vue/composition-api` with plugin auto installing.
  14. - `2.7`: exports from `vue` (Composition API is built-in in Vue 2.7).
  15. - `>=3.0`: exports from `vue`, with polyfill of Vue 2's `set` and `del` API.
  16. ## Usage
  17. Install this as your plugin's dependency:
  18. ```bash
  19. npm i vue-demi
  20. # or
  21. yarn add vue-demi
  22. # or
  23. pnpm i vue-demi
  24. ```
  25. Add `vue` and `@vue/composition-api` to your plugin's peer dependencies to specify what versions you support.
  26. ```jsonc
  27. {
  28. "dependencies": {
  29. "vue-demi": "latest"
  30. },
  31. "peerDependencies": {
  32. "@vue/composition-api": "^1.0.0-rc.1",
  33. "vue": "^2.0.0 || >=3.0.0"
  34. },
  35. "peerDependenciesMeta": {
  36. "@vue/composition-api": {
  37. "optional": true
  38. }
  39. },
  40. "devDependencies": {
  41. "vue": "^3.0.0" // or "^2.6.0" base on your preferred working environment
  42. },
  43. }
  44. ```
  45. Import everything related to Vue from it, it will redirect to `vue@2` + `@vue/composition-api` or `vue@3` based on users' environments.
  46. ```ts
  47. import { ref, reactive, defineComponent } from 'vue-demi'
  48. ```
  49. Publish your plugin and all is done!
  50. > When using with [Vite](https://vitejs.dev), you will need to opt-out the pre-bundling to get `vue-demi` work properly by
  51. > ```js
  52. > // vite.config.js
  53. > export default defineConfig({
  54. > optimizeDeps: {
  55. > exclude: ['vue-demi']
  56. > }
  57. > })
  58. > ```
  59. ### Extra APIs
  60. `Vue Demi` provides extra APIs to help distinguish users' environments and to do some version-specific logic.
  61. ### `isVue2` `isVue3`
  62. ```ts
  63. import { isVue2, isVue3 } from 'vue-demi'
  64. if (isVue2) {
  65. // Vue 2 only
  66. } else {
  67. // Vue 3 only
  68. }
  69. ```
  70. ### `Vue2`
  71. To avoid bringing in all the tree-shakable modules, we provide a `Vue2` export to support access to Vue 2's global API. (See [#41](https://github.com/vueuse/vue-demi/issues/41).)
  72. ```ts
  73. import { Vue2 } from 'vue-demi'
  74. if (Vue2) {
  75. Vue2.config.ignoredElements.push('x-foo')
  76. }
  77. ```
  78. ### `install()`
  79. Composition API in Vue 2 is provided as a plugin and needs to be installed on the Vue instance before using. Normally, `vue-demi` will try to install it automatically. For some usages where you might need to ensure the plugin gets installed correctly, the `install()` API is exposed to as a safe version of `Vue.use(CompositionAPI)`. `install()` in the Vue 3 environment will be an empty function (no-op).
  80. ```ts
  81. import { install } from 'vue-demi'
  82. install()
  83. ```
  84. ## CLI
  85. ### Manually Switch Versions
  86. To explicitly switch the redirecting version, you can use these commands in your project's root.
  87. ```bash
  88. npx vue-demi-switch 2
  89. # or
  90. npx vue-demi-switch 3
  91. ```
  92. ### Package Aliasing
  93. If you would like to import `vue` under an alias, you can use the following command
  94. ```bash
  95. npx vue-demi-switch 2 vue2
  96. # or
  97. npx vue-demi-switch 3 vue3
  98. ```
  99. Then `vue-demi` will redirect APIs from the alias name you specified, for example:
  100. ```ts
  101. import * as Vue from 'vue3'
  102. var isVue2 = false
  103. var isVue3 = true
  104. var Vue2 = undefined
  105. export * from 'vue3'
  106. export {
  107. Vue,
  108. Vue2,
  109. isVue2,
  110. isVue3,
  111. }
  112. ```
  113. ### Auto Fix
  114. If the `postinstall` hook doesn't get triggered or you have updated the Vue version, try to run the following command to resolve the redirecting.
  115. ```bash
  116. npx vue-demi-fix
  117. ```
  118. ### Isomorphic Testings
  119. You can support testing for both versions by adding npm alias in your dev dependencies. For example:
  120. ```json
  121. {
  122. "scripts": {
  123. "test:2": "vue-demi-switch 2 vue2 && jest",
  124. "test:3": "vue-demi-switch 3 && jest",
  125. },
  126. "devDependencies": {
  127. "vue": "^3.0.0",
  128. "vue2": "npm:vue@2"
  129. },
  130. }
  131. ```
  132. or
  133. ```json
  134. {
  135. "scripts": {
  136. "test:2": "vue-demi-switch 2 && jest",
  137. "test:3": "vue-demi-switch 3 vue3 && jest",
  138. },
  139. "devDependencies": {
  140. "vue": "^2.6.0",
  141. "vue3": "npm:vue@3"
  142. },
  143. }
  144. ```
  145. ## Examples
  146. See [examples](./examples).
  147. ## Who is using this?
  148. - [VueUse](https://github.com/vueuse/vueuse) - Collection of Composition API utils
  149. - [@vue/apollo-composable](https://github.com/vuejs/vue-apollo/tree/v4/packages/vue-apollo-composable) - Apollo GraphQL functions for Vue Composition API
  150. - [vuelidate](https://github.com/vuelidate/vuelidate) - Simple, lightweight model-based validation
  151. - [vue-composition-test-utils](https://github.com/ariesjia/vue-composition-test-utils) - Simple vue composition api unit test utilities
  152. - [vue-use-stripe](https://github.com/frandiox/vue-use-stripe) - Stripe Elements wrapper for Vue.js
  153. - [@opd/g2plot-vue](https://github.com/open-data-plan/g2plot-vue) - G2plot for vue
  154. - [vue-echarts](https://github.com/ecomfe/vue-echarts) - Vue.js component for Apache ECharts.
  155. - [fluent-vue](https://github.com/Demivan/fluent-vue) - Vue.js integration for [Fluent.js](https://github.com/projectfluent/fluent.js) - JavaScript implementation of [Project Fluent](https://projectfluent.org)
  156. - [vue-datatable-url-sync](https://github.com/socotecio/vue-datatable-url-sync) - Synchronize datatable options and filters with the url to keep user preference even after refresh or navigation
  157. - [vue-insta-stories](https://github.com/UnevenSoftware/vue-insta-stories) - Instagram stories in your vue projects.
  158. - [vue-tiny-validate](https://github.com/FrontLabsOfficial/vue-tiny-validate) - Tiny Vue Validate Composition
  159. - [v-perfect-signature](https://github.com/wobsoriano/v-perfect-signature) - Pressure-sensitive signature drawing for Vue 2 and 3
  160. - [vue-winbox](https://github.com/wobsoriano/vue-winbox) - A wrapper component for WinBox.js that adds the ability to mount Vue components.
  161. - [vue-word-highlighter](https://github.com/kawamataryo/vue-word-highlighter) - The word highlighter library for Vue 2 and Vue 3
  162. - [vue-chart-3](https://github.com/victorgarciaesgi/vue-chart-3) - Vue.js component for Chart.js
  163. - [json-editor-vue](https://github.com/cloydlau/json-editor-vue) - JSON editor & viewer for Vue 2 and 3.
  164. - [kidar-echarts](https://github.com/kidarjs/kidar-echarts) - A simpler echarts component for Vue 2 and 3.
  165. - [vue3-sketch-ruler](https://github.com/kakajun/vue3-sketch-ruler) - The zoom operation used for page presentation for Vue 2 and 3( Replace render function with template )
  166. - [vue-rough-notation](https://github.com/Leecason/vue-rough-notation) - RoughNotation wrapper component for Vue 2 and 3.
  167. - [vue-request](https://github.com/AttoJS/vue-request) - Vue composition API for data fetching, supports SWR, polling, error retry, cache request, pagination, etc.
  168. - [vue3-lazyload](https://github.com/murongg/vue3-lazyload) - A vue3.x image lazyload plugin.
  169. - [vue-codemirror6](https://github.com/logue/vue-codemirror6) - CodeMirror6 component for Vue2 and 3.
  170. - [@tanstack/vue-query](https://github.com/TanStack/query) - TanStack Query for Vue.
  171. > open a PR to add your library ;)
  172. ## Underhood
  173. See [the blog post](https://antfu.me/posts/make-libraries-working-with-vue-2-and-3/#-introducing-vue-demi).
  174. ## License
  175. MIT License © 2020 [Anthony Fu](https://github.com/antfu)