Internet Explorer 11์์ ansi-styles
์ ํ์ดํ ๊ธฐ๋ฅ์์ ์ค๋จ๋๋ ๋ฌธ์ ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๊ตฌ ์ฌํญ ์ฒด์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ansi-styles
chalk
react-dev-utils
razzle-dev-utils
์ด๊ฒ์ # 522์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. ํ ๋ฒ # 547์ ์ํด ์์ ๋์์ ์ ์์ต๋๋ค. strip-ansi
& ansi-regex
โฆ ๊ฐ์ ํจํค์ง๋ ์๋์ง๋ง AFAIK์ ๊ด๋ จ์ด ์๋ค๋ ์ ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. chalk
์ ๊ด๋ จ์ด ์์ต๋๋ค. ๋ฏธ๋ค์จ์ด๋ฅผ ๋ค์๋ก๋ํฉ๋๋ค.
์ด๋ฅผ ์ฌํํ๋ ํน๋ณํ ๋จ๊ณ๋ ์์ต๋๋ค. ์๋ก์ด Razzle ์ฑ์ ๋ง๋ค๊ณ IE 11์์ ์คํ ํด๋ณด์ธ์.
์ด์ create-react-app์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ์ด์ ๋ณ๋์ ํจํค์ง๋ก ์ตํธ ์ธ ์ด ์๋ค๋ ๊ฒ์ ์๊ณ
์ด์ v3 ์ฉ์ผ๋ก ์ ๋ฐ์ดํธ ๋ polyfill ์
๊ทธ๋ฌ๋ ์ด๊ฒ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋น์ทํ ๊ฒ์ด CRA์์ ์ถ์ ๋๊ณ ์๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค : https://github.com/facebook/create-react-app/issues/5336. ๊ทธ๊ฒ์ Map
์ ์๋์ง ์์ ๊ฒ๊ณผ ๊ด๋ จ์ด ์์ผ๋ฉฐ, ์ด๋ polyfill๋ก ๊ณ ์ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ์ดํด ๋ ๊ฒ์
๋๋ค.
IE 9-11 ์ง์์ ๊ดํ์ด ๋ชจ๋ ๊ฒ์ ํด๋ฆฌ ํ๋ง์ ๊ดํ ๊ฒ์ ๋๋ค. polyfill์ด ํ์ดํ ๊ธฐ๋ฅ์ ์์ ํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ฝ๋๋ ์ด์ ๋ธ๋ผ์ฐ์ ์ฉ์ผ๋ก ๋ณํ๋์ง ์์์ผ๋ฉฐ ์ข ์์ฑ ์์ฒด๋ฅผ ์ ๋ฐ์ดํธํ์ง ์๊ณ ๋ ์ด๋ป๊ฒ ์์ ํ ์ ์๋์ง ์ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ํ ansi-regex
, strip-ansi
, ์ผ๋ถ ๊ธฐํ ๋ฌธ์ ์
๋๋ค. ํ์ผ์ react-dev-utils
(ํฌํจ formatWebpackMessages.js
๋ฐ ๊ธฐํ) chalk
์ ์ํด ์๊ตฌ๋๋ ํ์ผ react-dev-utils
. ๋๋ react-dev-utils์ ์ต์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ๋ฒ๊ทธ์ธ์ง ๋๋์ด ํญ๋ชฉ์ด ๋ฒ๋ค์ ํฌํจ๋์ง ์์์ผํ๋์ง ๋๋ ๋ฌด์์ธ์ง ํ์คํ์ง ์์ต๋๋ค.
์ฌ๊ธฐ์ ํด๊ฒฐํด์ผ ํ ๋ ๊ฐ์ง ์ฌํญ์ด ์์ต๋๋ค.
Polyfill์ ๋ ์ด์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋์ง ์์ต๋๋ค (CRA2์์๋ ๋์ผ ํจ). Polyfill์ Promise / Map / Set / Symbol / Object.assign / Array.isArray / String.startsWith / etc์ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. react-app-polyfill
๋ถํฐ ํน์ ์ฑ์ ํ์ํ ํน์ core-js ํด๋ฆฌ ํ ์๊ตฌ์ ์ด๋ฅด๊ธฐ๊น์ง์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ๋ 12 ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. Babel ์์ฒด๊ฐ ์ ์ ํ ๊ตฌ์ฑ์ผ๋ก ์ฝ๋์ ํ์ํ core-js ํด๋ฆฌ ํ์ ํ์
ํ๋ ๋ฐ ๋์์ด ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค (์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ์์ ์ ์์ต๋๊น? ์ CRA2๊ฐ์ด ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ง ์์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค).
์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๋ ๋ ์ด์ ๋ชจ๋์ es5 ๋ฒ์ ( ansi-regex
, react-dev-utils
๋ฑ)์ ๋ฐฐํฌํ์ง ์์ต๋๋ค. IE11์ด ๋ฑ๋ฑํ ํ์ด์ ์ง์ํ๋ ๊ฒ์ ๋ณธ๋ค๋ฉด ์ด๊ฒ์ ๋น์ ์ด ์ง๋ฉด ํ ๋ฌธ์ ์
๋๋ค. CRA2๋ node_modules ( CRA2์ webpack conf )๋ฅผ ํ์ฌ ์ปดํ์ผํ๋ ค๋ ํน์ node_modules ๋ฅผ ์์ต๋๋ค .
IE 11์์ ์๋ํ๋๋ก ๋ณ๊ฒฝํ๋ ๋ฐ ํ์ํ ์ฌํญ์ ์ฌ์ ํ ์ป์ง ๋ชปํฉ๋๋ค. ์ด์ ์ ์ฒด ํ๋ก๋์
๋ฒ๋ค์๋ const
๋ฐ ํ์ดํ ๊ธฐ๋ฅ์ด ํฌํจ๋์ด ์์ต๋๋ค.
์ถ์ ๋ ๋ฒ๋ค์๋ณด๊ณ ์ด๋ค ๋ชจ๋์ด ํธ๋์ค ํ์ผ์ด ํ์ํ์ง ์์ ๋ด์ผํฉ๋๊น? ์ํ๊น ๋ค์, ๋ ์ ๊ทผํ๊ธฐ ์ฌ์ด ๋ฐฉ๋ฒ์ด ์๋์?
์ด๊ฒ์ ๋๋ฅผ ์ํด ์ผํ๋ ๊ฒ์ ์ป์์ต๋๋ค.
https://github.com/styleguidist/react-styleguidist/pull/1327#issuecomment -483928457
์ข ์ง์ฆ๋
์๋์ ๋ฐ๋ผ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
https://create-react-app.dev/docs/supported-browsers-features/#supported -browsers
์๋ browserlist๋ก package.json์ ์ ๋ฐ์ดํธํ์ฌ IE์์ ์๋ํ๋๋กํฉ๋๋ค.
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all",
"last 2 ie version"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version",
"last 2 ie version"
]
},
์ด๋ ๊ฒํ๋ฉด const
& arrow
ํจ์์์ด ์ต์ํ ์ฝ๋๋ฅผ ์ค์ ํ ์ ์์ง๋ง, ๊ทธ ํ webpackHotDevClient์ ๊ฐํ์ ์ฝ์์์ ๊นจ์ง๊ธฐ ์์ํ๊ณ ๋จ์๋ ์ป์ง ๋ชปํฉ๋๋ค.
์ด ๋ฌธ์ ์ ๋ํด ๋ง์ ํด๊ฒฐ์ฑ
์ ์๋ํ์ต๋๋ค.
์ ๊ณต๋ ์๋ฃจ์
์ค ์ด๋ ๊ฒ๋ IE11 ๋๋ Edge์์ ๊ฐ๋ฐ ์ค์ด ์๋๋๋ค.
IE ๋ฒ์ : 11.864.17763.0
์๋๋ ๋ด ํจํค์ง json ํ์ผ์ ๋๋ค.
{
"name": "typescript_tutorial",
"๋ฒ์ ": "0.1.0",
"private": ์ฐธ,
"์ข
์์ฑ": {
"@ testing-library / jest-dom": "^ 4.2.4",
"@ testing-library / react": "^ 9.4.0",
"@ testing-library / user-event": "^ 7.2.1",
"@ types / jest": "^ 24.0.25",
"@ types / node": "^ 12.12.24",
"@ types / react": "^ 16.9.17",
"@ types / react-dom": "^ 16.9.4",
"๋ฐ์": "^ 16.12.0",
"react-app-polyfill": "^ 1.0.5",
"react-dom": "^ 16.12.0",
"๋ฐ์ ์คํฌ๋ฆฝํธ": "3.3.0",
"typescript": "^ 3.7.4"
},
"์คํฌ๋ฆฝํธ": {
"start": "๋ฐ์ ์คํฌ๋ฆฝํธ ์์",
"build": "๋ฐ์ ์คํฌ๋ฆฝํธ ๋น๋",
"test": "๋ฐ์ ์คํฌ๋ฆฝํธ ํ
์คํธ",
"eject": "๋ฐ์ ์คํฌ๋ฆฝํธ ๊บผ๋ด๊ธฐ"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": {
"์์ฐ": [
"> 0.2 %",
"์ฃฝ์ง ์์๋ค",
"op_mini ๋ชจ๋ ์๋"
],
"๊ฐ๋ฐ": [
"> 0.2 %",
"์ฃฝ์ง ์์๋ค",
"op_mini ๋ชจ๋ ์๋",
"์ต๊ทผ 1 ๊ฐ์ ํฌ๋กฌ ๋ฒ์ ",
"์ต๊ทผ 1 ๊ฐ์ Firefox ๋ฒ์ ",
"์ต๊ทผ 1 ๊ฐ์ ์ฌํ๋ฆฌ ๋ฒ์ ",
"์ต๊ทผ 2 ๊ฐ IE ๋ฒ์ "
]
},
"devDependencies": {
"eslint-config-airbnb": "^ 18.0.1",
"eslint-config-prettier": "^ 6.9.0",
"eslint-plugin-import": "^ 2.18.2",
"eslint-plugin-jsx-a11y": "^ 6.2.3",
"eslint-plugin-prettier": "^ 3.1.2",
"eslint-plugin-react": "^ 7.14.3",
"eslint-plugin-react-hooks": "^ 1.7.0",
"node-sass": "^ 4.13.0",
"์์": "^ 1.19.1"
}
}
์ด ๋ฌธ์ ์ ๋ํ ๋ด ์๋ฃจ์
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค (Windows์์๋ ๊ฒฝ๋ก์ \
๊ตฌ๋ถ ๊ธฐํธ๊ฐ ํ์ํ์ง๋ง Linux์์๋ /
-์ ๊ท์์์ ๊ณ ๋ ค ๋จ).
razzle.config.js
:
'use strict';
// The list was taken from
// https://github.com/styleguidist/react-styleguidist/pull/1327#issuecomment-483928457
// the regex is changed to work both on Windows and Linux
const ieRule = {
test: /\.jsx?$/,
include: new RegExp(
`node_modules[/|\\\\](?=(${[
'acorn-jsx',
'estree-walker',
'regexpu-core',
'unicode-match-property-ecmascript',
'unicode-match-property-value-ecmascript',
'react-dev-utils',
'ansi\-styles',
'ansi-regex',
'chalk',
'strip-ansi'
].join('|')}))`
),
use: {
loader: "babel-loader",
options: {
presets: [["@babel/preset-env", { targets: { ie: 11 } }]]
}
}
};
module.exports = {
modify: (config, { target, dev }, webpack) => {
// full config https://github.com/jaredpalmer/razzle/blob/master/packages/razzle/config/createConfig.js
config.module.rules.unshift(ieRule);
return config;
},
};
.babelrc
:
{
"presets": [
[
"razzle/babel",
{
"targets": {
"browsers": [
"ie 11",
"last 2 Chrome versions",
"last 2 Firefox versions",
"last 2 Safari versions"
]
}
}
]
]
}
๋ํ IE 11์๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ค๋ฅ๊ฐ ์์ต๋๋ค.
SecurityError
์ ๊ณต ํ ์ค๋ฅ์ ์คํ ์ถ์ ์ด ์์ต๋๋ค.
ํธํ๋์ง ์๋ SockJS! ๊ธฐ๋ณธ ์ฌ์ดํธ๋ '1.3.0', iframe : '1.4.0'์ ์ฌ์ฉํฉ๋๋ค.
์ฌ๊ธฐ์ ์ธ๊ธ ๋๋๋ก Windows ๋ ์ง์คํธ๋ฆฌ๋ฅผ ํธ์งํ์ฌ ํด๊ฒฐ๋์์ต๋๋ค.
https://stackoverflow.com/questions/52549799/securityerror-on-ie11-when-initializing-websocket
์ฆ ๋ด๊ฐ ๋ง๋
HKEY_LOCAL_MACHINE (or HKEY_CURRENT_USER)
SOFTWARE
Microsoft
Internet Explorer
Main
FeatureControl
FEATURE_WEBSOCKET_MAXCONNECTIONSPERSERVER
iexplore.exe = (DWORD) 0x0000014 (20)
ํ์ด์ง ๋น ํ์ฉ๋๋ ์น ์์ผ ์๋ฅผ ๋๋ฆฝ๋๋ค. ๊ทธ ํ ๋ฌธ์ ๊ฐ ๋ ์์ฃผ ๋ํ๋ฌ์ต๋๋ค (๊ฑฐ์ ๋ถํธ ํจ์์ด ๋๋ฒ๊ทธํ๊ธฐ์ ์ถฉ๋ถํ์ง๋ง ๋ค์ ๋ํ๋๋ฉด ๋ค๋ฅธ ํญ์ ์ด๊ณ ํ์ฌ ํญ์ ๋ซ์์ผํฉ๋๋ค).
๋๋ ๋ฉฐ์น ๋์ ์ด๊ฒ์๋ณด๊ณ ๋ง์นจ๋ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ป์์ต๋๋ค.
WebpackDevServer์ ํด๋ผ์ด์ธํธ๋ฅผ react-dev-utils / webpackHotDevClient์์ webpack / hot / dev-server์ ๋์์ผ๋ก ๋ณ๊ฒฝํด์ผํ์ต๋๋ค.
webpack.config.js ํ์ผ๋ก ์ด๋ํ์ฌ ๋ค์ ์ค์ ๊ต์ฒดํด์ผํฉ๋๋ค.
isEnvDevelopment && require.resolve('react-dev-utils/webpackHotDevClient'),
์ด๊ฒ์ผ๋ก :
isEnvDevelopment && require.resolve('webpack/hot/dev-server'),
@ a1g0rithm ์ด๊ฒ์ ๋๋ฅผ ์ํด ์ผํฉ๋๋ค.
@ a1g0rithm webpack.config.js๋ฅผ ์ด๋์ ์ฐพ์์ต๋๊น?
@ a1g0rithm์์ ์ ๊ณต ํ๋ ๋์ ์ด ๋ ์ ์ผํ ์๋ฃจ์ ์ ๋๋ค. webpack.dev.config ํ์ผ์๋ ๋ค์ ๋ฉ์์ง๊ฐ ํฌํจ๋ฉ๋๋ค.
entry: [
// ...
// Note: instead of the default WebpackDevServer client, we use a custom one
// to bring better experience for Create React App users. You can replace
// the line below with these two lines if you prefer the stock client:
// require.resolve('webpack-dev-server/client') + '?/',
// require.resolve('webpack/hot/dev-server'),
require.resolve('react-dev-utils/webpackHotDevClient'),
์ฒ์ ๋ require.resolve
์ ์ฃผ์ ์ฒ๋ฆฌ๋ฅผ ์ ๊ฑฐํ๊ณ ๋ง์ง๋ง ์ฃผ์์ ์ฃผ์ ์ฒ๋ฆฌํ์ญ์์ค.
require.resolve('webpack-dev-server/client') + '?/',
require.resolve('webpack/hot/dev-server'),
// require.resolve('react-dev-utils/webpackHotDevClient'),
๋๋ ์ด๊ฒ์ด ๊ฐ๋ฐ์ค์ธ ํด๋ผ์ด์ธํธ ์นํฉ์ ๊ฐ์ ธ์จ ๋์ ๊ฐ์ ธ ์ค๊ธฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค. v4์์ ์์ ๋จ
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ ๋ฉฐ์น ๋์ ์ด๊ฒ์๋ณด๊ณ ๋ง์นจ๋ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ป์์ต๋๋ค.
WebpackDevServer์ ํด๋ผ์ด์ธํธ๋ฅผ react-dev-utils / webpackHotDevClient์์ webpack / hot / dev-server์ ๋์์ผ๋ก ๋ณ๊ฒฝํด์ผํ์ต๋๋ค.
webpack.config.js ํ์ผ๋ก ์ด๋ํ์ฌ ๋ค์ ์ค์ ๊ต์ฒดํด์ผํฉ๋๋ค.
isEnvDevelopment && require.resolve('react-dev-utils/webpackHotDevClient'),
์ด๊ฒ์ผ๋ก :
isEnvDevelopment && require.resolve('webpack/hot/dev-server'),