[英]How to externalize a lib with vue-cli
在我的 vue-cli 项目(@vue/cli 4.4.4)中,我想在构建时排除 firebase 并在运行时包含它(通过 index.html)。
在我的package.json
我有那些进口
{
...
"dependencies": {
...
"firebase": "^7.24.0",
"firebaseui": "^4.7.1"
},
}
我想从构建中排除。 Google / SO 的研究让我在我的vue.config.js
中包含了这些行:
module.exports = {
...
configureWebpack: {
externals: {
firebaseui: "firebaseui",
firebase: "firebase",
},
}
};
还有webpack.config.js
:
module.exports = {
externals: {
firebase: "firebase",
firebaseui: "firebaseui",
},
};
但是,这不起作用。 Firebase 仍然包含在dist/js
文件夹中生成的 js 文件中。
如何使用来自 vue-cli 的 webpack 的排除功能仅将我自己的代码与一些小部门捆绑在一起?
我也偶然发现了这个问题。 Firebase Web SDK 捆绑时相当大。
通过他们的 CDN 导入 Firebase Web SDK 并将其放置在public/index.html
<!-- public/index.html -->
<head>
...
<title>...</title>
<!-- Firebase App, then all other used services in your app -->
<script src="https://www.gstatic.com/firebasejs/8.3.1/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.3.1/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.3.1/firebase-firestore.js"></script>
<!-- Firebase UI -->
<script src="https://www.gstatic.com/firebasejs/ui/4.8.0/firebase-ui-auth.js"></script>
</head>
创建一个src/firebase.js
作为单个入口点来初始化我的 firebase。
// src/firebase.js
import "firebase/app";
const firebaseConfig = {
...
};
firebase.initializeApp(firebaseConfig);
export default firebase;
然后在安装应用程序之前将其导入到我的src/main.js
文件中。
// src/main.js
import "@/firebase.js"; // @ is shorthand to /src
import { createApp } from "vue";
...
使用 Webpack Externals to map 全局firebase
由 CDN 公开给任何带有"firebase/app"
的导入。 我们不需要在 vue 文件中导入其他服务(即 auth、firestore),因为它将由 CDN 提供。
// vue.config.js
module.exports = {
...
chainWebpack: (config) => {
config.externals({
"firebase/app": "firebase",
firebaseui: "firebaseui",
});
},
...
};
请注意,我没有包含上述导入的默认导出的名称。 通过将其命名为firebase
(让智能感知工作)这样做会在浏览器中向我发出警告: Firebase is already defined in the global scope
。 您可以:
为导入使用不同的名称,例如: import fb from "firebase/app"
。 这将使智能感知在使用fb.<restOfObject>
时工作
或者,如果您正要部署应用程序并且不需要智能感知,则不要包含名称。
Either way, all of the firebase.<restOfObject>
functions will work on your code, since the Webpack Externals will map the firebase
global name exposed by the CDN to all your imports with firebase/app
.
即使不导入,所有其他组件现在都可以访问全局firebase
object。
// Sample of a .vue file
<script>
const auth = firebase.auth(); // this still works
const ui = new firebaseui.auth.AuthUI(auth); // this too
export default {
data() {
...
}
};
</script>
我在这里指出的内容可能有错误。 对此答案的任何改进表示赞赏。 这是我的第一个答案,希望能帮到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.