Vercel에서 레거시(legacy) 브라우저 지원 방법
Vercel에서 구형 브라우저를 지원하기 위한 폴리필과 전략을 다룹니다.
Introduction
현대적인 웹 개발 환경에서도 IE11이나 구형 모바일 브라우저를 지원해야 하는 경우가 있습니다. Vercel에서 레거시 브라우저를 효과적으로 지원하는 방법을 살펴보겠습니다.
Environment
# 브라우저 지원 범위
# Modern: Chrome 80+, Firefox 75+, Safari 13+, Edge 80+
# Legacy: IE 11, Chrome 60-, Mobile Safari 10-
# 빌드 도구
npm list @babel/preset-env core-js
# @babel/preset-env@7.23.0
# core-js@3.34.0Problem
구형 브라우저에서 앱이 작동하지 않았습니다:
# IE11 에러
'Promise' is undefined
'Array.from' is not a function
'Object.assign' is undefined
# 구형 모바일
'fetch' is not defined
'Symbol' is undefinedSolution
1. Babel 설정
// .babelrc
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"ie": "11",
"safari": "10",
"chrome": "60"
},
"useBuiltIns": "usage",
"corejs": 3
}
]
]
}2. next.config.js 폴리필 설정
// next.config.js
const nextConfig = {
// 레거시 브라우저 지원
transpilePackages: ['some-es6-package'],
// 빌드 최적화
experimental: {
forceSwcTransforms: true,
},
// 폴리필 설정
webpack: (config, { isServer, dev }) => {
if (!isServer && !dev) {
config.target = 'web';
}
return config;
},
};
module.exports = nextConfig;3. HTML 폴리필 추가
// pages/_document.js
import { Html, Head, Main, NextScript } from 'next/document';
export default function Document() {
return (
{/* 구형 브라우저 폴리필 */}
);
}4. CSS 폴리필
/* styles/legacy.css */
/* Flexbox 폴리필 */
.flex-container {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
/* Grid 폴리필 */
.grid-container {
display: -ms-grid;
display: grid;
}
/* CSS Variables 폴리필 */
:root {
--primary-color: #0070f3;
}
.element {
color: var(--primary-color);
color: #0070f3; /* 폴리필 */
}5. JavaScript 폴리필
// lib/polyfills.js
// Promise 폴리필
if (typeof Promise === 'undefined') {
window.Promise = require('es6-promise').Promise;
}
// Array.from 폴리필
if (!Array.from) {
Array.from = function(arrayLike) {
return [].slice.call(arrayLike);
};
}
// Object.assign 폴리필
if (!Object.assign) {
Object.assign = function(target) {
if (target == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
target = Object(target);
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
if (source != null) {
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
}
return target;
};
}
// fetch 폴리필
if (typeof fetch === 'undefined') {
require('whatwg-fetch');
}6. 조건부 폴리필 로딩
// lib/browser.js
export function isLegacyBrowser() {
if (typeof window === 'undefined') return false;
const ua = window.navigator.userAgent;
const msie = ua.indexOf('MSIE ');
const trident = ua.indexOf('Trident/');
return msie > -1 || trident > -1;
}
export function loadPolyfills() {
if (isLegacyBrowser()) {
return import('./polyfills').then(() => {
console.log('Legacy polyfills loaded');
});
}
return Promise.resolve();
}// pages/_app.js
import { useEffect } from 'react';
import { loadPolyfills } from '../lib/browser';
export default function App({ Component, pageProps }) {
useEffect(() => {
loadPolyfills();
}, []);
return ;
}Lessons Learned
- 타겟 브라우저 설정: 지원할 브라우저 범위를 명확히 정의하세요
- 폴리필 선택: 필요한 폴리필만 선택하여 번들 크기를 줄이세요
- CSS 호환성: CSS 기능에 대한 폴리필을 적용하세요
- 테스트 다양성: 여러 브라우저에서 테스트하세요
- 점진적 개선: 레거시 브라우저에서는 기본 기능만 제공하세요
This blog does not accept any external sponsorships, affiliate marketing, or ad revenue.