#webpack #vue-cli
#webpack #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 по-прежнему включена в сгенерированные js-файлы в dist/js
папке.
Как я могу использовать функцию исключения webpack из vue-cli, чтобы связать только мой собственный код с некоторыми небольшими deps?
Ответ №1:
Я тоже наткнулся на этот вопрос. Firebase Web SDK довольно большой в комплекте.
Что я сделал:
Импортировали Firebase Web SDK через свой CDN и поместили его в 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>
Создайте a 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 для сопоставления глобального firebase
, предоставляемого CDN, с любым импортом с "firebase/app"
помощью . Нам не нужно импортировать другие сервисы (например, auth, firestore) в файлы vue, поскольку это будет предоставлено CDN.
// vue.config.js
module.exports = {
...
chainWebpack: (config) => {
config.externals({
"firebase/app": "firebase",
firebaseui: "firebaseui",
});
},
...
};
Обратите внимание, что я не включил имя для экспорта импорта по умолчанию выше. При этом, назвав ее также as firebase
(чтобы заставить intellisense работать), я получаю предупреждение в браузере: Firebase is already defined in the global scope
. Вы могли бы либо:
- Используйте другое имя для импорта, например:
import fb from "firebase/app"
. Это позволит intellisense работать при использованииfb.<restOfObject>
- Или просто не указывайте имя, если вы только собираетесь развернуть приложение и вам не нужен intellisense.
В любом случае, все firebase.<restOfObject>
функции будут работать в вашем коде, поскольку внешние компоненты Webpack будут сопоставлять firebase
глобальное имя, предоставляемое CDN, со всем вашим импортом firebase/app
.
Все остальные компоненты теперь имеют доступ к глобальному firebase
объекту даже без импорта.
// 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>
Размер сборки Vue
Ссылки
- https://forum.vuejs.org/t/vue-cli-adding-external-js-and-css-libraries/38946
- https://firebase.google.com/docs/web/setup#add-sdks-initialize
В том, что я указал здесь, могут быть ошибки. Приветствуется любое улучшение этого ответа. Это мой первый ответ, и я надеюсь, что смогу помочь.
Комментарии:
1. Большое спасибо! Я попробую это сделать. Кроме того, я занимаюсь рефакторингом своего приложения, чтобы firebase использовалась только в одном месте (main.ts). Тогда мне вообще не нужно будет вызывать firebase в файлах vue.