Webpack 配置是 Vue CLI 设置的一部分(可以使用 进行检查vue inspect
)。这是其中的一个相关部分:
entry: {
foo: [
'.../src/foo.js'
],
barWidget: [
'.../src/barWidget.js'
],
},
optimization: {
splitChunks: {
cacheGroups: {
vendors: {
name: 'chunk-vendors',
test: /[\\/]node_modules[\\/]/,
priority: -10,
chunks: 'initial'
},
common: {
name: 'chunk-common',
minChunks: 2,
priority: -20,
chunks: 'initial',
reuseExistingChunk: true
}
}
},
...
HTML 输出为:
<script type="text/javascript" src="/assets/js/chunk-vendors.[HASH].js"></script>
<script type="text/javascript" src="/assets/js/foo.[HASH].js"></script>
和
<script type="text/javascript" src="/assets/js/chunk-vendors.[HASH].js"></script>
<script type="text/javascript" src="/assets/js/barWidget.[HASH].js"></script>
foo
根据需要拥有尽可能多的脚本标签是没有问题的,但barWidget
它是应该立即加载的小部件入口点,没有初始块依赖关系。我的意图是barWidget
加载一行代码(为此目的可能会禁用哈希):
<script type="text/javascript" src="/assets/js/barWidget.js"></script>
但在当前状态下,如果chunk-vendors
省略,则无法加载。
我更喜欢保持vendors
和common
块原样,因为它们以合理的方式拆分,并且可以在入口点之间的客户端重用,但我需要barWidget
自动加载它依赖的块。一种不太可取的方法是禁用块,但barWidget
仅在其他入口点中的块拆分应保持不变。
一种重现它的方法基本上是一个添加了 2 个入口点的新 Vue CLI 项目,或者任何具有类似配置拆分的 Webpack 项目。
这是项目(为了完整性而列出):
包.json
{
"name": "foobar",
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build"
},
"dependencies": {
"core-js": "^3.6.5",
"vue": "^3.0.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"@vue/compiler-sfc": "^3.0.0"
}
}
vue.config.js
module.exports = {
pages: {
foo: {
entry: 'src/foo.js',
template: 'public/foo.html',
filename: 'foo.html'
},
barWidget: {
entry: 'src/barWidget.js',
template: 'public/barWidget.html',
filename: 'barWidget.html'
},
},
};
公共/foo.html
公共/barWidget.html
<!DOCTYPE html>
<html>
<body>
<div id="app"></div>
</body>
</html>
src/foo.js
import { createApp } from 'vue'
import Foo from './Foo.vue'
createApp(Foo).mount('#app')
Foo.vue
<template>
<HelloWorld msg="Foo"/>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
components: {
HelloWorld
}
}
</script>
src/barWidget.js
import { createApp } from 'vue'
import BarWidget from './BarWidget.vue'
createApp(BarWidget).mount('#app')
BarWidget.vue
<template>
<HelloWorld msg="Bar widget"/>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
components: {
HelloWorld
}
}
</script>
是否可以通过 Webpack
barWidget
强制自动加载chunk-vendors.[HASH].js
,而无需在使用的地方显式加载barWidget.[HASH].js
?是否可以
barWidget
强制入口点不使用其他初始块(chunk-vendors
等)并输出自给自足的barWidget.js
捆绑包,而不影响拆分在其他入口点的工作方式?描述的场景还有其他选择吗?