Sentry-javascript: [ ์˜ค๋ฅ˜ ] ./node_modules/@sentry/node/esm/integrations/console.js ๋ชจ๋“ˆ์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ: Nextjs์˜ Sentry์—์„œ '์ฝ˜์†”'์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2020๋…„ 01์›” 11์ผ  ยท  22์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: getsentry/sentry-javascript

ํŒจํ‚ค์ง€ + ๋ฒ„์ „

  • @sentry/browser ^5.11.0
  • @sentry/node ^5.11.0
  • node v12.7.0

์„ค๋ช…

๋‚˜๋Š” nextjs ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ๊ณ  nextjs ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ด ํŠœํ† ๋ฆฌ์–ผ์„ ๋”ฐ๋ž์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋‚ด ์•ฑ์„ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•œ ํ›„ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

[ error ] ./node_modules/@sentry/node/esm/integrations/console.js
Module not found: Can't resolve 'console' in '/.../node_modules/@sentry/node/esm/integrations'

์•ฑ์„ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ณ  ์›์‚ฌ ์ž ๊ธˆ์„ ์ œ๊ฑฐํ•˜๊ณ  ํด๋”๋ฅผ ๋นŒ๋“œํ–ˆ์ง€๋งŒ ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค! ๋‚ด node_modules์— ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์žˆ์ง€๋งŒ!

์˜ค๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด Sentry๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

import * as Sentry from '@sentry/node';

Screenshot from 2020-01-11 12-56-20

Needs Triage

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

@5tormTrooper ์ด๊ฒƒ์ด ๋„์›€์ด ๋ ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ require ๋ฌธ์— ()๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค.

const withSourceMaps = require('@zeit/next-source-maps')()

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

๋ฌธ์ œ๋Š” @zeit/next-source-maps ์˜ ๋ฒ„์ „์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
@zeit/next-source-maps": "0.0.4-canary.1 .

๊ทธ๋Ÿผ ์ฒญ์†Œ node_modules ์ œ๊ฑฐ yarn.lock ์™€ ์žฌ๊ฑด์„! ์ง€๊ธˆ ์ž‘๋™ ์ค‘์ž…๋‹ˆ๋‹ค!

@afsanefda node_modules yarn.lock node_modules ์ œ๊ฑฐํ•˜๊ณ  @zeit/next-source-maps": "0.0.4-canary.1 ๋ฅผ ์ข…์†์„ฑ์œผ๋กœ ๊ฐ€์ง„ ํ›„์—๋„ ์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค... ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์กฐ์น˜๋ฅผ ์ทจํ•˜ ์…จ์Šต๋‹ˆ๊นŒ?

์ถ”๊ฐ€ํ•˜๋‹ค:

if (!options.isServer) {
  config.resolve.alias['@sentry/node'] = '@sentry/browser'
}

next.config.js

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

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

๋ถ„๋ช…ํžˆ ๋ฒ„์ „ ๋ถˆ์ผ์น˜ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ๋ฒ„์ „์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์ œ์•ˆ์„ ์ •ํ™•ํžˆ ๋”ฐ๋ž์ง€๋งŒ ์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@5tormTrooper ์ด๊ฒƒ์ด ๋„์›€์ด ๋ ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ require ๋ฌธ์— ()๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค.

const withSourceMaps = require('@zeit/next-source-maps')()

๋‚˜๋Š” ์—ฌ์ „ํžˆ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@sentry/node^5.11.0

๋ˆ„๊ตฌ๋“ ์ง€ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@philkeys ๋Š” ์ด๋ฏธ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆ์šด.

Next.js๋ฅผ ' 9.1.6 '์—์„œ ' 9.3.5 '๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ ํ›„์—๋„ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋””๋ฒ„๊น… ํ›„์— ' @sentry/node '๊ฐ€ ์–ด๋–ป๊ฒŒ๋“  ํด๋ผ์ด์–ธํŠธ ๋ฒˆ๋“ค์—์„œ ๋๋‚ฌ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ผ์ธ์ด ๊ฐ‘์ž๊ธฐ ์ž‘๋™์„ ๋ฉˆ์ถ˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

if (!isServer) { config.resolve.alias['@sentry/node'] = '@sentry/browser'; }

์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ธฐ๋Šฅ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ฐธ์กฐ๋œ ๋ชจ๋“  ๋ฌธ์ œ๋Š” ์ด๋ฏธ ๊ฐœ๋ฐœ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์–ด๋–ป๊ฒŒ๋“  ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ๋ฌธ์ œ ๋ฐ ์žฌํ˜„ ์‚ฌ๋ก€๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด ํŠน์ • ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ œ๊ณตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ •๋ณด๋ฅผ ์œ„ํ•ด @kamilogorek thx. ๊ด€๋ จ์ด ์—†๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ํ•˜๋‚˜๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. OP๋Š” @zeit/next-source-maps ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค(์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ)

์„ผํŠธ๋ฆฌ ํ† ํฐ์ด ํฌํ•จ๋œ .env ํŒŒ์ผ์„ ์ง์ ‘ ์ œ๊ณตํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ณต์ œ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ํ•ด๊ฒฐ์ฑ…?

์ œ๊ณต๋œ ์˜ˆ์ œ ๋ฅผ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๋ณต์ œ next export )๋กœ ์ „ํ™˜ํ•  ๋•Œ ์ด ๋ฌธ์ œ๊ฐ€ ๋‹ค์‹œ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. SSG์— ๋Œ€ํ•œ ์„œ๋ฒ„ ๋ณด๊ณ ์„œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— webpack ๋ณ„์นญ(+ @sentry/node ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ)์„ ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. . ์ด์ œ @sentry/browser ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ค„์ด ์žˆ๋Š” ๊ฒฝ์šฐ:

if (!isServer) { config.resolve.alias['@sentry/node'] = '@sentry/browser'; }

๊ทธ๋Ÿฐ ๋‹ค์Œ @sentry/browser ๋„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ์ข€ ์‹ฌํ•˜๋„ค์š”...

๋‚ด next.config.js์—์„œ ๋‚˜๋Š” ์ด๋ฏธ fs: "empty" ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์—ˆ๊ณ  !isServer ๋•Œ ๋ธŒ๋ผ์šฐ์ €๋กœ sentry/node ๋ณ„์นญ๋„ ์ง€์ •ํ–ˆ์ง€๋งŒ ๊ฑฐ๊ธฐ์— console.log๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋กœ๊ทธ๊ฐ€ ์ฝ˜์†”์— ์ธ์‡„๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ฐ€์ง„ ํ”Œ๋Ÿฌ๊ทธ์ธ(withSourceMaps, withSass, withOptimizedImages)์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํŒŒํ—ค์น˜๊ณ  ๊ฐ๊ฐ์— console.log๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒฐ๊ณผ, ๋‚ด ๊ธฐ๋ณธ ๊ตฌ์„ฑ์ด ์ด ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์™ธ๋ถ€ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์ „์†ก๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์ž์ฒด๊ฐ€ ์žˆ์ง€๋งŒ ๋ฌด์–ธ๊ฐ€๊ฐ€ ์—ฌ์ „ํžˆ ๊บผ์ ธ ์žˆ์Œ):

module.exports = withBundleAnalyzer(
    withSourceMaps(
        withSass(
            withOptimizedImages(baseConfig)
        )
    )

๋”ฐ๋ผ์„œ fs: "empty"๋Š” ์ ˆ๋Œ€ ์กด์ค‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฐพ์€ ํ•ด๊ฒฐ์ฑ…์€ next-compose-plugins ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ ๋‹ค์Œ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

module.exports = withPlugins(
  [
    [withOptimizedImages],
    [withSass],
    [withSourceMaps],
    [withBundleAnalyzer],
  ],
  baseConfig
);

๋‹ค์Œ ์ค„์ด ์žˆ๋Š” ๊ฒฝ์šฐ:

if (!isServer) { config.resolve.alias['@sentry/node'] = '@sentry/browser'; }

๊ทธ๋Ÿฐ ๋‹ค์Œ @sentry/browser ๋„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ์ข€ ์‹ฌํ•˜๋„ค์š”...

@vpontis , ์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. Vue.js์™€ ํ•จ๊ป˜ Sentry๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์„ vue.config.js์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

  chainWebpack: (config) => {
    config.resolve.alias['@sentry/node'] = '@sentry/browser'
  }

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์†Œ์Šค ๋งต์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ @zeit/next-source-maps ํŒจํ‚ค์ง€๊ฐ€ 0.0.4-canary.1 ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋‚˜๋Š” next.config.js๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ next-source-maps ์™€ ํ•จ๊ป˜ sentry๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์†”๋ฃจ์…˜์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

if (process.env.NEXT_PUBLIC_SENTRY_DSN) { Sentry.init({ enabled: true, dsn: process.env.NEXT_PUBLIC_SENTRY_DSN, }); }

@sentry/node @sentry/browser @sentry/react ์„ค์น˜ํ•œ ํ›„ _app.js ์ž…๋ ฅํ–ˆ๋Š”๋ฐ ์—ฌ์ „ํžˆ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@zeit/next-source-maps": "0.0.4-canary.1๋„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค!

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ๊ฑฐํ•œ ๋‹ค์Œ ์ฝ”๋“œ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ๋‹ค์Œ ๊ตฌ์„ฑ์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

const { dev } = options

      if (!dev) {
        config.devtool = options.devtool || 'source-map'

        for (const plugin of config.plugins) {
          if (plugin.constructor.name === 'UglifyJsPlugin') {
            plugin.options.sourceMap = true
            break
          }
        }

        if (config.optimization && config.optimization.minimizer) {
          for (const plugin of config.optimization.minimizer) {
            if (plugin.constructor.name === 'TerserPlugin') {
              plugin.options.sourceMap = true
              break
            }
          }
        }
      }

์„ผํŠธ๋ฆฌ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ๋‹ค์Œ ์†Œ์Šค ๋งต ํ”Œ๋Ÿฌ๊ทธ์ธ์—๋Š”

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