#typescript #firebase #webpack #bundle
#typescript #firebase #webpack #пакет
Вопрос:
У меня настроена среда, в которой я пишу JS-код на стороне клиента на TypeScript (чтобы получить преимущества использования TS) и использую Webpack для объединения его в мой общедоступный каталог в моем проекте Firebase. Я обнаружил, что Webpack, похоже, добавляет довольно много накладных расходов к моему коду. При упаковке файла, который просто импортирует только модуль Firestore, получается около 300 КБ кода, когда исходный файл составляет <100 КБ.
Вот минимальная конфигурация, которая по-прежнему ведет себя так же:
index.ts
import 'firebase/firestore';
webpack.config.ts
import { Configuration } from 'webpack';
import path from 'path';
const config: Configuration = {
mode: 'production',
entry: path.resolve(__dirname, 'index.ts'),
module: {
rules: [
{
test: /.ts?$/,
use: 'ts-loader',
exclude: /node_modules/,
},
],
},
output: {
path: path.resolve(__dirname, 'dist'),
publicPath: '/',
filename: '[name].js',
chunkFilename: '[chunkhash].js'
},
resolve: {
extensions: [ '.ts', '.js' ],
modules: ['node_modules'],
},
optimization: {
minimize: true,
},
}
export default config;
tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"noImplicitReturns": true,
"noUnusedLocals": true,
"outDir": "lib",
"sourceMap": false,
"strict": true,
"target": "es2017",
"esModuleInterop": true,
},
"compileOnSave": true,
}
package.json
{
"name": "webpack-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" amp;amp; exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"firebase": "^8.0.2"
},
"devDependencies": {
"ts-loader": "^8.0.11",
"ts-node": "^9.0.0",
"typescript": "^4.0.5",
"webpack": "^5.4.0",
"webpack-cli": "^4.2.0"
}
}
Как объяснялось выше, конечный размер пакета составляет более 300 КБ, когда импортируемый файл имеет размер <100 КБ. Что я могу сделать, чтобы размер моего пакета не увеличился в три раза?
Комментарии:
1. Вы должны удалить свой исходный пост. Это вызовет проблемы, если вы оставите его.
2. Вы считаете размер зависимостей?
3. @RobertHarvey, я удалил свой оригинальный пост. Что касается подсчета размера зависимостей, все, что я делаю, это запуск webpack для этого одного файла ввода,
index.ts
. И все, что делает этот файл, это импортирует модуль firestore. Webpack выводитmain.js
файл размером более 300 КБ. Исходный модуль firestore имеет размер менее 100 КБ. Я не понимаю, как Webpack более чем в три раза увеличивает размер исходного кода.4. Webpack добавляет в сборку много собственных каркасов. Вы должны вручную удалить это, чтобы увидеть, что осталось. Но вам нужно будет оставить его, чтобы он мог выполнять свою работу при запуске приложения.
5. @DougStevenson если Webpack работает именно так, то я действительно не знаю, почему люди вообще используют его в этом контексте, потому что это просто сводит на нет прирост производительности небольшого исходного кода. Ранее я видел видео на YouTube, в котором инженер Google сказал, что они смогли получить пакет поставщиков размером менее 200 КБ для проекта, и я, честно говоря, не уверен, как они это сделали.
Ответ №1:
Хорошо, похоже, это известная проблема. Впервые это было упомянуто в этом выпуске в Firebase JS SDK GitHub (обсуждение перенесено сюда). Похоже, здесь есть довольно сложный обходной путь, или я мог бы просто использовать экспериментальную версию Firebase JS SDK.