Ant-design: ์ปดํŒŒ์ผ ๊ฒฝ๊ณ : ์ฒญํฌ ์Šคํƒ€์ผ [mini-css-extract-plugin] ์ถฉ๋Œํ•˜๋Š” ์ˆœ์„œ...

์— ๋งŒ๋“  2019๋…„ 02์›” 18์ผ  ยท  35์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ant-design/ant-design

์ด ๊ฒฝ๊ณ ๋Š” ์˜จ๋ผ์ธ ํ™˜๊ฒฝ์—์„œ ์žฌํ˜„ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ง์ ‘ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ

Next.js ํ”„๋กœ์ ํŠธ์—์„œ Ant Design์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. babel-plugin-import ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ์‹œ antd ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ๋„ ๊ดœ์ฐฎ์ง€๋งŒ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

chunk styles [mini-css-extract-plugin]
Conflicting order between:
 * css ./node_modules/css-loader??ref--5-2!./node_modules/less-loader/dist/cjs.js??ref--5-3!./node_modules/antd/lib/button/style/index.less
 * css ./node_modules/css-loader??ref--5-2!./node_modules/less-loader/dist/cjs.js??ref--5-3!./node_modules/antd/lib/dropdown/style/index.less

๊ทธ๋ฆฌ๊ณ  ํŽ˜์ด์ง€์˜ ์Šคํƒ€์ผ์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์•„ ์ƒˆ๋กœ ๊ณ ์นจ ํ›„ ์ •์ƒ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

โžœ  web git:(master) โœ— npm run build

> [email protected] build /Users/jagger/projects/jwpay/web
> next build


โœ” Client
  Compiled successfully in 12.77s

โœ” Server
  Compiled successfully in 8.64s

> Using external babel configuration
> Location: "/Users/jagger/projects/jwpay/web/.babelrc"
> Emitted warnings from webpack
Error: chunk commons [mini-css-extract-plugin]
Conflicting order between:
 * css ./node_modules/css-loader??ref--5-1!./node_modules/less-loader/dist/cjs.js??ref--5-2!./node_modules/antd/lib/button/style/index.less
 * css ./node_modules/css-loader??ref--5-1!./node_modules/less-loader/dist/cjs.js??ref--5-2!./node_modules/antd/lib/dropdown/style/index.less
    at MiniCssExtractPlugin.renderContentAsset (/Users/jagger/projects/jwpay/web/node_modules/mini-css-extract-plugin/dist/index.js:342:37)
    at Object.render (/Users/jagger/projects/jwpay/web/node_modules/mini-css-extract-plugin/dist/index.js:173:32)
    at Compilation.createChunkAssets (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/Compilation.js:2429:29)
    at hooks.optimizeTree.callAsync.err (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/Compilation.js:1299:10)
    at AsyncSeriesHook.eval [as callAsync] (eval at create (/Users/jagger/projects/jwpay/web/node_modules/tapable/lib/HookCodeFactory.js:32:10), <anonymous>:9:1)
    at AsyncSeriesHook.lazyCompileHook (/Users/jagger/projects/jwpay/web/node_modules/tapable/lib/Hook.js:154:20)
    at Compilation.seal (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/Compilation.js:1244:27)
    at hooks.make.callAsync.err (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/Compiler.js:624:17)
    at _err0 (eval at create (/Users/jagger/projects/jwpay/web/node_modules/tapable/lib/HookCodeFactory.js:32:10), <anonymous>:11:1)
    at Promise.all.then (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/DynamicEntryPlugin.js:74:20)
    at process.internalTickCallback (internal/process/next_tick.js:77:7)
Error: chunk commons [mini-css-extract-plugin]
Conflicting order between:
 * css ./node_modules/css-loader??ref--5-1!./node_modules/less-loader/dist/cjs.js??ref--5-2!./node_modules/antd/lib/dropdown/style/index.less
 * css ./node_modules/css-loader??ref--5-1!./node_modules/less-loader/dist/cjs.js??ref--5-2!./node_modules/antd/lib/icon/style/index.less
    at MiniCssExtractPlugin.renderContentAsset (/Users/jagger/projects/jwpay/web/node_modules/mini-css-extract-plugin/dist/index.js:342:37)
    at Object.render (/Users/jagger/projects/jwpay/web/node_modules/mini-css-extract-plugin/dist/index.js:173:32)
    at Compilation.createChunkAssets (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/Compilation.js:2429:29)
    at hooks.optimizeTree.callAsync.err (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/Compilation.js:1299:10)
    at AsyncSeriesHook.eval [as callAsync] (eval at create (/Users/jagger/projects/jwpay/web/node_modules/tapable/lib/HookCodeFactory.js:32:10), <anonymous>:9:1)
    at AsyncSeriesHook.lazyCompileHook (/Users/jagger/projects/jwpay/web/node_modules/tapable/lib/Hook.js:154:20)
    at Compilation.seal (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/Compilation.js:1244:27)
    at hooks.make.callAsync.err (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/Compiler.js:624:17)
    at _err0 (eval at create (/Users/jagger/projects/jwpay/web/node_modules/tapable/lib/HookCodeFactory.js:32:10), <anonymous>:11:1)
    at Promise.all.then (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/DynamicEntryPlugin.js:74:20)
    at process.internalTickCallback (internal/process/next_tick.js:77:7)
Error: chunk commons [mini-css-extract-plugin]
Conflicting order between:
 * css ./node_modules/css-loader??ref--5-1!./node_modules/less-loader/dist/cjs.js??ref--5-2!./node_modules/antd/lib/menu/style/index.less
 * css ./node_modules/css-loader??ref--5-1!./node_modules/less-loader/dist/cjs.js??ref--5-2!./node_modules/antd/lib/icon/style/index.less
    at MiniCssExtractPlugin.renderContentAsset (/Users/jagger/projects/jwpay/web/node_modules/mini-css-extract-plugin/dist/index.js:342:37)
    at Object.render (/Users/jagger/projects/jwpay/web/node_modules/mini-css-extract-plugin/dist/index.js:173:32)
    at Compilation.createChunkAssets (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/Compilation.js:2429:29)
    at hooks.optimizeTree.callAsync.err (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/Compilation.js:1299:10)
    at AsyncSeriesHook.eval [as callAsync] (eval at create (/Users/jagger/projects/jwpay/web/node_modules/tapable/lib/HookCodeFactory.js:32:10), <anonymous>:9:1)
    at AsyncSeriesHook.lazyCompileHook (/Users/jagger/projects/jwpay/web/node_modules/tapable/lib/Hook.js:154:20)
    at Compilation.seal (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/Compilation.js:1244:27)
    at hooks.make.callAsync.err (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/Compiler.js:624:17)
    at _err0 (eval at create (/Users/jagger/projects/jwpay/web/node_modules/tapable/lib/HookCodeFactory.js:32:10), <anonymous>:11:1)
    at Promise.all.then (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/DynamicEntryPlugin.js:74:20)
    at process.internalTickCallback (internal/process/next_tick.js:77:7)
Error: chunk commons [mini-css-extract-plugin]
Conflicting order between:
 * css ./node_modules/css-loader??ref--5-1!./node_modules/less-loader/dist/cjs.js??ref--5-2!./node_modules/antd/lib/tooltip/style/index.less
 * css ./node_modules/css-loader??ref--5-1!./node_modules/less-loader/dist/cjs.js??ref--5-2!./node_modules/antd/lib/icon/style/index.less
    at MiniCssExtractPlugin.renderContentAsset (/Users/jagger/projects/jwpay/web/node_modules/mini-css-extract-plugin/dist/index.js:342:37)
    at Object.render (/Users/jagger/projects/jwpay/web/node_modules/mini-css-extract-plugin/dist/index.js:173:32)
    at Compilation.createChunkAssets (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/Compilation.js:2429:29)
    at hooks.optimizeTree.callAsync.err (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/Compilation.js:1299:10)
    at AsyncSeriesHook.eval [as callAsync] (eval at create (/Users/jagger/projects/jwpay/web/node_modules/tapable/lib/HookCodeFactory.js:32:10), <anonymous>:9:1)
    at AsyncSeriesHook.lazyCompileHook (/Users/jagger/projects/jwpay/web/node_modules/tapable/lib/Hook.js:154:20)
    at Compilation.seal (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/Compilation.js:1244:27)
    at hooks.make.callAsync.err (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/Compiler.js:624:17)
    at _err0 (eval at create (/Users/jagger/projects/jwpay/web/node_modules/tapable/lib/HookCodeFactory.js:32:10), <anonymous>:11:1)
    at Promise.all.then (/Users/jagger/projects/jwpay/web/node_modules/webpack/lib/DynamicEntryPlugin.js:74:20)
    at process.internalTickCallback (internal/process/next_tick.js:77:7)
 โ”Œ /
 โ”œ /_app
 โ”œ /_document
 โ”œ /_error
 โ”œ /login
 โ”” /register

ํ™˜๊ฒฝ

ํŒจํ‚ค์ง€.json

{
  "name": "web",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "LOG_API_REQUEST=y node server.js",
    "build": "next build",
    "start": "NODE_ENV=production node server.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@fortawesome/fontawesome-svg-core": "^1.2.8",
    "@fortawesome/free-brands-svg-icons": "^5.5.0",
    "@fortawesome/free-regular-svg-icons": "^5.5.0",
    "@fortawesome/free-solid-svg-icons": "^5.5.0",
    "@fortawesome/react-fontawesome": "^0.1.3",
    "@zeit/next-css": "^1.0.1",
    "@zeit/next-less": "^1.0.1",
    "@zeit/next-sass": "^1.0.1",
    "ant-design-pro": "^2.2.1",
    "antd": "^3.13.2",
    "babel-plugin-import": "^1.11.0",
    "bootstrap": "^4.1.3",
    "express": "^4.16.4",
    "i": "^0.3.6",
    "isomorphic-unfetch": "^3.0.0",
    "less": "^3.9.0",
    "less-vars-to-js": "^1.3.0",
    "next": "^8.0.1",
    "node-sass": "^4.10.0",
    "npm": "^6.4.1",
    "react": "^16.8.1",
    "react-dom": "^16.8.1",
    "react-redux": "^5.1.1",
    "redux": "^4.0.1",
    "redux-thunk": "^2.3.0"
  },
  "devDependencies": {
    "http-proxy-middleware": "^0.19.1",
    "redux-devtools-extension": "^2.13.5"
  }
}

.babelrc

{
  "presets": [
    "next/babel"
  ],
  "plugins": [
    [
      "import",
      {
        "libraryName": "antd",
        "style": true
      },
      "antd"
    ],
    [
      "import",
      {
        "libraryName": "ant-design-pro",
        "style": true,
        "camel2DashComponentName": false,
      },
      "ant-design-pro"
    ]
  ]
}

next.config.js

const withCSS = require('@zeit/next-css')
const withSass = require('@zeit/next-sass')
const withLess = require('@zeit/next-less')
const lessToJS = require('less-vars-to-js')
const fs = require('fs')
const path = require('path')

// fix: prevents error when .less files are required by node
if (typeof require !== 'undefined') {
  require.extensions['.less'] = file => { }
}

const isProd = process.env.NODE_ENV === 'production'

module.exports = withLess(withSass(withCSS({
  lessLoaderOptions: {
    javascriptEnabled: true,
    modifyVars: lessToJS(
      fs.readFileSync(path.resolve(__dirname, './assets/antd.less'), 'utf8')
    ),
  },
})))

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์—ฌ๊ธฐ ์‚ฌ๋žŒ๋“ค์˜ ์ ˆ๋ฐ˜์ด ์ค‘๊ตญ์–ด(๋˜๋Š” ๋ฌด์—‡์ด๋“ )๋กœ ์‘๋‹ตํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋‹ˆ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์— ํ‹ฐ์ผ“์„ ์—ด๋ฉด ์ดํƒˆ๋ฆฌ์•„์–ด๋กœ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  35 ๋Œ“๊ธ€

@jaggerwang ๋‹˜ , ๊ท€ํ•˜์˜ ๋ฌธ์ œ๋Š” ๋ฌธ์ œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ค€์ˆ˜ํ•˜์ง€ ์•Š์•„ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ ๋„์šฐ๋ฏธ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@jaggerwang ์•ˆ๋…•ํ•˜์„ธ์š”. ํšจ์œจ์ ์ธ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ์œ„ํ•ด ํ•ด๋‹น ์ด์Šˆ์— ๋Œ€ํ•œ ํŠน์ • ํ˜•์‹ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉฐ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ์•Š์•„ ๋ฌธ์ œ๊ฐ€ ์ž๋™์œผ๋กœ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ ๋„์šฐ๋ฏธ ๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค์–ด ์˜ค๋ฅ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜‘๋ ฅ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ทธ๋ ‡๊ฒŒ ๋†’์€ ์ž„๊ณ„๊ฐ’์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ด๋ ‡๊ฒŒ ์—„๊ฒฉํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ฐ€์ง„ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๊ฐ€ ์˜จ๋ผ์ธ์œผ๋กœ ์‹œ์—ฐํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด ์ปดํŒŒ์ผ ๋ฐ ํŒจํ‚ค์ง• ์˜ค๋ฅ˜๋Š” ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…๋˜์–ด ์žˆ์œผ๋ฉฐ ์‰ฝ๊ฒŒ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์ธต์˜ ์„ค๋ช…์ด ์„ธ์‹ฌํ•˜๊ฒŒ ์ค€๋น„๋˜์–ด์žˆ๋Š” ๊ฒƒ์ด ์œ ๊ฐ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜์…จ๋‚˜์š”?

@bluenergy๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๋จผ์ € ๋„ฃ์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Antd์— ๋ฌธ์ œ๋ฅผ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ค๋ช…์€ ๋งํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ๋น„๊ณต๊ฐœ์ด๋ฉฐ ์ „์ฒด ๋ฐ๋ชจ ์˜ˆ์ œ๊ฐ€ ๋‚˜์˜ค๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ํ•ต์‹ฌ์€ ์ด ๋ฌธ์ œ๊ฐ€ ์‚ฌ์šฉ๋ฒ•๊ณผ ๊ฑฐ์˜ ๊ด€๋ จ์ด ์—†๊ณ  ์ฃผ๋กœ ๊ตฌ์„ฑ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฉฐ ์žฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Antd Issues๊ฐ€ ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ๋น„ํ•ด ๋„ˆ๋ฌด ์ ์€ ๊ฒƒ์€ ๋‹น์—ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์—„๊ฒฉํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ฐ€์ง„ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค ๋ฌธ์ œ ๋„์šฐ๋ฏธ ์ „์ฒด์˜ ๊ฐœ๋…์€ vue ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ด€ํ–‰์— ๊ธฐ๋ฐ˜์„ ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒˆ์‹ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์—๋„ˆ์ง€๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์šฐ๋ฆฌ์˜ ๋Šฅ๋ ฅ ๊ณผ ์—๋„ˆ์ง€๋„ ์ œํ•œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.์šฐ๋ฆฌ๋Š” ๋” ๋งŽ์€ ์ •๋ณด์™€ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ œํ•œ๋œ ์ž์›์„ ์šฐ์„ ์‹œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ๋ฌธ์ œ(ํŠนํžˆ ์›นํŒฉ ๊ตฌ์„ฑ)๊ฐ€ ์˜จ๋ผ์ธ ์ฝ”๋“œ์ƒŒ๋“œ๋ฐ•์Šค๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œํ•œ์˜ git repo ์ €์žฅ์†Œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ ์ •๋ณด์™€ ์ด์œ ๋Š” vue ์ž‘์„ฑ์ž You Xiaoyou๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

image

image


Antd Issues๊ฐ€ ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ๋น„ํ•ด ๋„ˆ๋ฌด ์ ์€ ๊ฒƒ์€ ๋‹น์—ฐํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ํ”„๋กœ์ ํŠธ๋Š” ๋˜ํ•œ ์—„๊ฒฉํ•œ ๋ฌธ์ œ ๋„์šฐ๋ฏธ ๋ฐ ์ž๋™ ์ข…๋ฃŒ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๋ฌธ์ œ ์ฒ˜๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋” ๋ถ€์ง€๋Ÿฐํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ํ•™์ƒ๋“ค์˜ ํ—Œ์‹ ์ด ๋งŽ๊ณ  ์„ธ ๋ฒˆ์งธ๋Š” ์ข‹์€ ํ”ผ๋“œ๋ฐฑ์€ ๋‹น์‹ ๊ณผ ๋‚˜๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ @jaggerwang ์˜ ํ”ผ๋“œ๋ฐฑ๊ณผ ์ดํ•ด์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์•Œ์•˜์–ด์š”! ์‹œ๊ฐ„๋˜์‹ค๋•Œ ํ•œ๋ฒˆ ๋ฐ›์•„๋ณด์„ธ์š”.

@jaggerwang @afc163 ๋„ create-react-app ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ babel-plugin-import ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜๊ณ  antd ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๊ฐ„๋‹จํ•˜๊ณ  ์ž์„ธํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ git ์„ธ๋ถ€์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  yarn build ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ ๊ฒฝ๊ณ ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
image
์ด ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด 3๊ฐœ์˜ ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด 3๊ฐœ์˜ ๋ถ„๊ธฐ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์กฐ์ • ํ›„ yarn build ์‹คํ–‰ ํ›„ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋” ์ด์ƒ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. ์ˆ˜๋™ ๋ถ„๊ธฐ , ์ˆ˜๋™์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ ํ•ด๋‹น ์Šคํƒ€์ผ์„ antd์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  2. No-lazy ๋ถ„๊ธฐ , ์ง€์—ฐ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ฝ”๋“œ ๋ถ„ํ• ์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  3. no-css-import ๋ธŒ๋žœ์น˜ , babel-plugin-import ์‚ฌ์šฉ ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค. style ํŒŒ์ผ์€ ๋” ์ด์ƒ ์ปดํฌ๋„ŒํŠธ์™€ ์˜จ๋””๋งจ๋“œ๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ณ , ์ปดํฌ๋„ŒํŠธ๋งŒ ๋ถˆ๋Ÿฌ์˜ค๊ณ , ์Šคํƒ€์ผ์€ ์ „์ฒด์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. ์—”ํŠธ๋ฆฌ ํŒŒ์ผ. ์ด๊ฒƒ์€ ์ผ๋ถ€ ๋ถˆํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ ์Šคํƒ€์ผ์˜ ๋„์ž…์œผ๋กœ ์ด์–ด์ง€์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ antd ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ์‹ค์ œ ํŒจํ‚ค์ง€ CSS ๋ณผ๋ฅจ์ด ๋งŽ์ด ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
"plugins": [
  [
    "import",
    {
      "libraryName": "antd",
      "libraryDirectory": "es"
    }
  ]
]

๋ฌผ๋ก  ์ด๊ฒƒ๋“ค์€ ๋‚˜์˜ ์ผ์‹œ์ ์ธ ํ•ด๊ฒฐ์ฑ…์ด๋ฉฐ ํฐ ์‚ฌ๋žŒ๋“ค์ด ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ๋” ๋งŽ์€ ํ•ด๊ฒฐ์ฑ…์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ์ด ๋ฌธ์ œ, ๋‹ค์–‘ํ•œ ์Šคํƒ€์ผ์˜ ์ถฉ๋Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„์™€์ฃผ์„ธ์š”!

React.lazy ๋„์ž…ํ–ˆ์„ ๋•Œ๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ํฐ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ ๋†’์€ ์ˆ˜์ค€์˜ ์ฝ”๋“œ ๋ถ„ํ• ์„ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ ์–ด๋–ค ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์ž˜๋ชป๋œ ์ˆœ์„œ๋กœ ๋˜์–ด ์žˆ๋Š”์ง€ ์ถ”์ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. next-antd-aza-less - https://www.npmjs.com/package/next-antd-aza-less ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

umi ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณธ ํ›„ ์›นํŒฉ ๊ตฌ์„ฑ์— FilterCSSConflictingWarning ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

@lonsdale8734 ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์— ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

antd ๊ตฌ์„ฑ ์š”์†Œ์˜ ์Šคํƒ€์ผ์€ ๋…๋ฆฝ์ ์ด๊ณ  ์Šคํƒ€์ผ ํŒŒ์ผ ์ˆœ์„œ์™€ ๊ด€๋ จ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ๊ณ ๋Š” ๋ฌด์‹œํ•˜๊ฑฐ๋‚˜ ํ•„ํ„ฐ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ˜์†”์—์„œ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋ผ๋Š” mini-css-extract-plugin์˜ ์กฐ์–ธ ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { Button, Table } from 'antd'; // File 1

import { Table, Button } from 'antd'; // File 2

NS

import { Button, Table } from 'antd'; // File 1

import { Button, Table } from 'antd'; // File 2

๋‹ค์‹œ ์ฐธ๊ณ :์Šคํƒ€์ผ์ด ๋…๋ฆฝ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ์ˆœ์„œ ์—†์ด antd ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

@zombieJ
babel-plugin-import ์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๊นŒ?
biz ํ”„๋กœ์ ํŠธ์—์„œ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๋งŽ์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

@jaaggerwang
์ด ๋ฒ„๊ทธ์˜ ๋˜ ๋‹ค๋ฅธ ์ด์œ ๋Š” lib dir์—์„œ Component๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์˜ˆ:

import { Button } from 'antd'
import Dropdown from 'antd/lib/dropdown'

...

๊ทธ๋ฆฌ๊ณ  ๊ท€ํ•˜์˜ ํ”„๋กœ์ ํŠธ๋Š” babel-plugin-import ๋ฅผ ๋” ์ ๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ์ผ€์ด์Šค๊ฐ€ mini-css-extract-plugin ๊ฒฝ๊ณ ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” antd์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ์ž ์ •์˜ ํฌ๋ผ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด ์ฝ”๋“œ์ด๋ฉฐ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋ฉฐ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

const addMyPlugin = ๊ตฌ์„ฑ => {
...
};
module.exports = ์žฌ์ •์˜(
์ถ”๊ฐ€ ๋‚ด ํ”Œ๋Ÿฌ๊ทธ์ธ,
fixBabelImports("๊ฐ€์ ธ์˜ค๊ธฐ", {
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„: "antd",
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋””๋ ‰ํ† ๋ฆฌ: "es",
์Šคํƒ€์ผ: ์‚ฌ์‹ค
}),
addLessLoader({
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ: ์ฐธ,
์ˆ˜์ •๋ณ€์ˆ˜: {
"@primary-color": "#0A4080"
}
})
);

๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ ์‚ฌ๋žŒ๋“ค์˜ ์ ˆ๋ฐ˜์ด ์ค‘๊ตญ์–ด(๋˜๋Š” ๋ฌด์—‡์ด๋“ )๋กœ ์‘๋‹ตํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋‹ˆ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์— ํ‹ฐ์ผ“์„ ์—ด๋ฉด ์ดํƒˆ๋ฆฌ์•„์–ด๋กœ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@AmazingTurtle ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž์ด๊ณ  Google ๋ฒˆ์—ญ์— ๋Œ€ํ•ด ๋“ค์–ด๋ณธ ์ ์ด ์—†๋‹ค๋ฉด ๊ณค๊ฒฝ์— ์ฒ˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜ํ•˜. ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์˜์–ด๋ฅผ ๊ตฌ์‚ฌํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ๋ง์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค...์ค‘๊ตญ์–ด(๋ถ๊ฒฝ์–ด).

Screen Shot 2019-09-19 at 2 22 35 AM

@blujedis ๋ธŒ๋ผ์šฐ์ €์— ๋‚ด์žฅ๋œ ๋ฒˆ์—ญ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์˜ค๋ฅธ์ชฝ ํด๋ฆญ -> ๋ฒˆ์—ญ). github.com์ด ์–ธ์–ด๋ฅผ EN์œผ๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— EN์„ ์†Œ์Šค ์–ธ์–ด๋กœ ๊ฐ•์ œํ•˜๋ฏ€๋กœ ์ค‘๊ตญ์–ด๋ฅผ ๋ฒˆ์—ญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒˆ์—ญ๊ฐ€๋Š” ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์–ธ์–ด๋ฅผ ๋ฒˆ์—ญํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ๊ฒŒ์‹œ๋ฌผ์„ ๋ณต์‚ฌํ•˜๊ณ  ์ˆ˜๋™์œผ๋กœ ๋ฒˆ์—ญํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

react-app-rewired ๋˜๋Š” ์œ ์‚ฌํ’ˆ ๋ฐ ์Šคํ‹ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ disable mini-css-extract-plugin warning ๋ฐฉ์‹์œผ๋กœ ์ด๋™ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด:

  1. "mini-css-extract-plugin": "^0.8.0" ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค(์ด ๋ฒ„์ „์—๋Š” ์ฃผ๋ฌธ ๊ฒฝ๊ณ ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋Š” ์ถ”๊ฐ€ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค)
  2. config-overrides.js ์— ์ด ~(๋”์ฐํ•œ ํ•ดํ‚น)~์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.
  // force react-scripts to use newer version of `mini-css-extract-plugin` and ignore css ordering warnings
  // (related to issue: https://github.com/facok/create-react-app/issues/5372)
  for (let i = 0; i < config.plugins.length; i++) {
    const p = config.plugins[i]
    if(!!p.constructor && p.constructor.name === MiniCssExtractPlugin.name) {
      const miniCssExtractOptions = {...p.options, ignoreOrder: true}
      config.plugins[i] = new MiniCssExtractPlugin(miniCssExtractOptions)
      break
    }
  }

๋ฉ”๋‰ด, ๋“œ๋กญ๋‹ค์šด, ํˆดํŒ ๊ฐ„์— ๋ฌธ์ œ๊ฐ€ ์ถฉ๋Œํ•˜์—ฌ ๋“œ๋กญ๋‹ค์šด์„ ์™ธ๋ถ€๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ž‘๋™ ์ค‘์ž…๋‹ˆ๋‹ค

์—์„œ

import { Menu, Dropdown, Button, Icon } from 'antd';

NS

import { Menu, Button, Icon } from 'antd';
import Dropdown from 'antd/lib/dropdown';

์†”๋ฃจ์…˜์ด ๋ชจ๋“  antd ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‰ฝ์Šต๋‹ˆ๊นŒ?
์ด๊ฑฐ ๋‹ค์‹œ ์—ด์–ด๋„ ๋ ๊นŒ์š”?!

@zombieJ ์†”๋ฃจ์…˜์ด ํ•ญ์ƒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๊ตฌ์„ฑํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ์—ด์–ด์ฃผ์„ธ์š”...

Gastby ํ”„๋กœ์ ํŠธ์—์„œ ์ด์™€ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Create React App๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

@ChuckJonas์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ์—ด์–ด์ฃผ์„ธ์š”.

@zombieJ ,

์ˆ˜์ž…ํ’ˆ์„ ์•ŒํŒŒ๋ฒณ์ˆœ์œผ๋กœ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ ์ด๊ฒƒ์„ ํ•˜๊ณ  ์žˆ๋‹ค(Prettier/ESLint๋ฅผ ํ†ตํ•ด):

image

๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ ์˜ ํŽ˜์ด์ง€ ๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๋ฅผ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด webpack-filter-warnings-plugin ์„ ์„ค์น˜

const FilterWarningsPlugin = require('webpack-filter-warnings-plugin');

module.exports = {
  // ... rest of webpack config
  plugins: [
    new FilterWarningsPlugin({ 
      exclude: /Conflicting order/,
    })
  ]
}

์•ฑ์ด ์‹ค์ œ๋กœ 100% ์ œ๋Œ€๋กœ ๋ณด์ด๋„๋ก ํ•˜๋ ค๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฐพ์€ ์œ ์ผํ•œ ์‹ค์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์ „์ฒด ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์–ป์—ˆ๋‹ค

ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ antd ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ง€์—ฐ ๋กœ๋“œํ•˜์—ฌ ์ด ์˜ค๋ฅ˜๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NextJS์˜ ์˜ˆ๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

const Menu = dynamic(() => import('antd/lib/menu'))
const MenuItem = dynamic(() => import('antd/lib/menu/MenuItem'))

์—ฌ๊ธฐ์—์„œ antd์˜ ๋ฉ”๋‰ด ๋ฐ ๋ฉ”๋‰ด ํ•ญ๋ชฉ์„ ์ œ์ž๋ฆฌ์— ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ MenuItem ๊ฐ€ Menu.Item import {Menu} from 'antd' ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ์Šคํƒ€์ผ ๊ฐ„์˜ ์ถฉ๋Œ ์ˆœ์„œ ๋ฌธ์ œ๋Š” ์—†์Šต๋‹ˆ๋‹ค."
์ด๋Š” less๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  babel-import-plugin์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฉ”๋‰ด, ๋“œ๋กญ๋‹ค์šด, ํˆดํŒ ๊ฐ„์— ๋ฌธ์ œ๊ฐ€ ์ถฉ๋Œํ•˜์—ฌ ๋“œ๋กญ๋‹ค์šด์„ ์™ธ๋ถ€๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ž‘๋™ ์ค‘์ž…๋‹ˆ๋‹ค

์—์„œ

import { Menu, Dropdown, Button, Icon } from 'antd';

NS

import { Menu, Button, Icon } from 'antd';
import Dropdown from 'antd/lib/dropdown';

์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด antd/lib/button ์™€ ๋ณ„๋„๋กœ ๋ชจ๋“  Button ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

import { Form, Input, Row, Col } from 'antd'
import Button from 'antd/lib/button'

@phatranky๋‹˜ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

Antd์™€ ๊ด€๋ จ๋œ ๊ฒฝ์šฐ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๋ฅผ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

  • babel-plugin-import์˜ style ์˜ต์…˜์„ ์ง€์ •ํ•˜์—ฌ ์Šคํƒ€์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ 'css' ์—์„œ true ํ•˜๋ฉด less ๋ฒ„์ „์˜ ๊ฐœ๋ฏธ

  • ๋‹น์‹ ์˜ ์Šคํƒ€์ผ์„ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒฝ์šฐ 'antd/dist/antd.css' ,๋กœ ๋ณ€๊ฒฝ antd/dist/antd.less .

next.config.js ๋ถ€๋ถ„์€ this nextjs-css-less-antd ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”๋‰ด, ๋“œ๋กญ๋‹ค์šด, ํˆดํŒ ๊ฐ„์— ๋ฌธ์ œ๊ฐ€ ์ถฉ๋Œํ•˜์—ฌ ๋“œ๋กญ๋‹ค์šด์„ ์™ธ๋ถ€๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ž‘๋™ ์ค‘์ž…๋‹ˆ๋‹ค

์—์„œ

import { Menu, Dropdown, Button, Icon } from 'antd';

NS

import { Menu, Button, Icon } from 'antd';
import Dropdown from 'antd/lib/dropdown';

๊ฐ์‚ฌ ํ•ด์š”! ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ถฉ๋Œํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ณ„๋„๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ €์—๊ฒŒ๋Š” ์•„๋ž˜ 3๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ถฉ๋Œํ•˜๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

import { Button } from 'antd';
import Modal from 'antd/lib/modal';
import message from 'antd/lib/message';

์˜ˆ, ์ถ”ํ•˜๊ณ  ์–ด๋ฆฌ์„์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค.

๋ฉ”๋‰ด, ๋“œ๋กญ๋‹ค์šด, ํˆดํŒ ๊ฐ„์— ๋ฌธ์ œ๊ฐ€ ์ถฉ๋Œํ•˜์—ฌ ๋“œ๋กญ๋‹ค์šด์„ ์™ธ๋ถ€๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ž‘๋™ ์ค‘์ž…๋‹ˆ๋‹ค
์—์„œ

import { Menu, Dropdown, Button, Icon } from 'antd';

NS

import { Menu, Button, Icon } from 'antd';
import Dropdown from 'antd/lib/dropdown';

๊ฐ์‚ฌ ํ•ด์š”! ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ถฉ๋Œํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ณ„๋„๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ €์—๊ฒŒ๋Š” ์•„๋ž˜ 3๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ถฉ๋Œํ•˜๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

import { Button } from 'antd';
import Modal from 'antd/lib/modal';
import message from 'antd/lib/message';

์˜ˆ, ์ถ”ํ•˜๊ณ  ์–ด๋ฆฌ์„์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค.

์˜ˆ, Modal์„ ๋ณ„๋„๋กœ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๊ฒฝ๊ณ ๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

import Modal from 'antd/lib/modal/Modal'
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰