构建目标
运行 vue-cli-service build
时,可以通过 --target
选项指定不同的构建目标。这使您可以使用相同的代码库为不同的用例生成不同的构建。
应用
应用是默认的构建目标。在此模式下
index.html
具有资产和资源提示注入- 供应商库被拆分为单独的块,以便更好地缓存
- 小于 8KiB 的静态资源被内联到 JavaScript 中
public
中的静态资源被复制到输出目录
库
关于 Vue 依赖项的说明
在 lib 模式下,Vue 是外部化的。这意味着捆绑包即使您的代码导入 Vue 也不会捆绑 Vue。如果库是通过捆绑器使用的,它将尝试通过捆绑器加载 Vue 作为依赖项;否则,它将回退到全局 Vue
变量。
要避免这种行为,请向 build
命令提供 --inline-vue
标志。
vue-cli-service build --target lib --inline-vue
您可以使用以下命令构建单个入口作为库
vue-cli-service build --target lib --name myLib [entry]
File Size Gzipped
dist/myLib.umd.min.js 13.28 kb 8.42 kb
dist/myLib.umd.js 20.95 kb 10.22 kb
dist/myLib.common.js 20.57 kb 10.09 kb
dist/myLib.css 0.33 kb 0.23 kb
入口可以是 .js
或 .vue
文件。如果没有指定入口,将使用 src/App.vue
。
lib 构建输出
dist/myLib.common.js
:一个 CommonJS 捆绑包,用于通过捆绑器使用(不幸的是,webpack 目前还不支持捆绑包的 ES 模块输出格式)dist/myLib.umd.js
:一个 UMD 捆绑包,用于直接在浏览器中或使用 AMD 加载器使用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 vs. JS/TS 入口文件
使用 .vue
文件作为入口时,您的库将直接公开 Vue 组件本身,因为组件始终是默认导出。
但是,当您使用 .js
或 .ts
文件作为入口时,它可能包含命名导出,因此您的库将作为模块公开。这意味着您的库的默认导出必须在 UMD 构建中作为 window.yourLib.default
访问,或者在 CommonJS 构建中作为 const myLib = require('mylib').default
访问。如果您没有任何命名导出并希望直接公开默认导出,您可以在 vue.config.js
中使用以下 webpack 配置
module.exports = {
configureWebpack: {
output: {
libraryExport: 'default'
}
}
}
Web 组件
关于兼容性的说明
Web 组件模式不支持 IE11 及更低版本。 更多详情
关于 Vue 依赖项的说明
在 Web 组件模式下,Vue 是外部化的。这意味着捆绑包即使您的代码导入 Vue 也不会捆绑 Vue。捆绑包将假定 Vue
作为全局变量在宿主页面上可用。
要避免这种行为,请向 build
命令提供 --inline-vue
标志。
vue-cli-service build --target wc --inline-vue
您可以使用以下命令构建单个入口作为 Web 组件
vue-cli-service build --target wc --name my-element [entry]
请注意,入口应为 *.vue
文件。Vue CLI 会自动将组件包装并注册为 Web 组件,您无需在 main.js
中自己执行此操作。您可以将 main.js
作为演示应用程序仅用于开发。
构建将生成一个包含所有内容的单个 JavaScript 文件(及其压缩版本)。该脚本在页面上包含时,会注册 <my-element>
自定义元素,该元素使用 @vue/web-component-wrapper
包装目标 Vue 组件。包装器会自动代理属性、属性、事件和插槽。有关更多详细信息,请参阅 @vue/web-component-wrapper
的文档。
请注意,捆绑包依赖于 Vue
在页面上全局可用。
此模式允许您的组件的使用者将 Vue 组件用作普通的 DOM 元素
<script src="https://unpkg.com/vue"></script>
<script src="path/to/my-element.js"></script>
<!-- use in plain HTML, or in any other framework -->
<my-element></my-element>
注册多个 Web 组件的捆绑包
构建 Web 组件捆绑包时,还可以通过使用通配符作为入口来定位多个组件
vue-cli-service build --target wc --name foo 'src/components/*.vue'
构建多个 Web 组件时,--name
将用作前缀,自定义元素名称将从组件文件名推断出来。例如,使用 --name foo
和名为 HelloWorld.vue
的组件,生成的自定义元素将注册为 <foo-hello-world>
。
异步 Web 组件
定位多个 Web 组件时,捆绑包可能会变得相当大,用户可能只使用捆绑包注册的几个组件。异步 Web 组件模式会生成一个代码拆分的捆绑包,其中包含一个小的入口文件,该文件提供所有组件之间的共享运行时,并在启动时注册所有自定义元素。然后,只有在页面上使用相应自定义元素的实例时,才会按需获取组件的实际实现
vue-cli-service build --target wc-async --name foo 'src/components/*.vue'
File Size Gzipped
dist/foo.0.min.js 12.80 kb 8.09 kb
dist/foo.min.js 7.45 kb 3.17 kb
dist/foo.1.min.js 2.91 kb 1.02 kb
dist/foo.js 22.51 kb 6.67 kb
dist/foo.0.js 17.27 kb 8.83 kb
dist/foo.1.js 5.24 kb 1.64 kb
现在在页面上,用户只需要包含 Vue 和入口文件
<script src="https://unpkg.com/vue"></script>
<script src="path/to/foo.min.js"></script>
<!-- foo-one's implementation chunk is auto fetched when it's used -->
<foo-one></foo-one>
在构建中使用 vuex
构建 Web 组件 或 库 时,入口点不是 main.js
,而是 entry-wc.js
文件,该文件在此处生成: https://github.com/vuejs/vue-cli/blob/dev/packages/%40vue/cli-service/lib/commands/build/resolveWcEntry.js
因此,要在 Web 组件目标中使用 vuex,您需要在 App.vue
中初始化存储
import store from './store'
// ...
export default {
store,
name: 'App',
// ...
}