Razzle: node_modulesμ—μ„œ λ³€ν™˜λ˜μ§€ μ•Šμ€ λͺ¨λ“ˆκ³Ό ν•¨κ»˜ μ‚¬μš©?

에 λ§Œλ“  2018λ…„ 07μ›” 01일  Β·  6μ½”λ©˜νŠΈ  Β·  좜처: jaredpalmer/razzle

μ•ˆλ…•!

NPM으둜 λ³€ν™˜λ˜μ§€ μ•Šμ€ μƒνƒœλ‘œ λ°°μ†‘λ˜λŠ” libλ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•˜λ―€λ‘œ Razzle-projectμ—μ„œ 둜컬둜 λ³€ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. js λ‘œλ”μ— 트랜슀파일용 λͺ¨λ“ˆμ„ ν¬ν•¨ν•˜λ„λ‘ razzle-configλ₯Ό μˆ˜μ •ν–ˆμœΌλ©° 더 이상 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•ŠμœΌλ―€λ‘œ ν΄λΌμ΄μ–ΈνŠΈ λΉŒλ“œμ—μ„œ μ œλŒ€λ‘œ μž‘λ™ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ„œλ²„ λΉŒλ“œλΌκ³  κ°€μ •ν•  λ•Œ "예기치 μ•Šμ€ 토큰 κ°€μ Έμ˜€κΈ°" 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

이것에 λŒ€ν•œ 아이디어가 μžˆμŠ΅λ‹ˆκΉŒ? λ¬Έμ œλŠ” μ–΄λ–»κ²Œ λ“  μ„œλ²„μ— λŒ€ν•΄μ„œλ„ λͺ¨λ“ˆμ„ νŠΈλžœμŠ€νŒŒμΌν•΄μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

미리 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ•Œκ² μŠ΅λ‹ˆλ‹€. babel-loader 의 포함을 ν™•μž₯ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ λ³€ν™˜λ˜μ§€ μ•Šμ€ νŒ¨ν‚€μ§€ λ‚΄μ˜ .babelrc 에 μ§€μ •λ˜μ§€ μ•ŠλŠ” ν•œ babelOptions 을 λͺ…μ‹œμ μœΌλ‘œ μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ•± νŒ¨ν‚€μ§€μ— /babelrc κ°€ μžˆλŠ” κ²ƒλ§ŒμœΌλ‘œλŠ” μΆ©λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ 전체 ꡬ성 μ˜ˆμž…λ‹ˆλ‹€.

'use strict';
const nodeExternals = require('webpack-node-externals');
const fs = require('fs');

module.exports = {
  modifyBabelOptions() {
    return {
      presets: ['razzle/babel'],
      plugins: ['transform-flow-strip-types'],
    };
  },
  modify(config, { target, dev }, webpack) {
    // package un-transpiled packages
    const babelRuleIndex = config.module.rules.findIndex(
      (rule) => rule.use && rule.use[0].loader && rule.use[0].loader.includes('babel-loader')
    );
    config.module.rules[babelRuleIndex] = Object.assign(config.module.rules[babelRuleIndex], {
      include: [
        ...config.module.rules[babelRuleIndex].include,
        fs.realpathSync('./node_modules/untranspiled-package')
      ],
    });
    config.externals =
      target === 'node'
        ? [
            nodeExternals({
              whitelist: [
                dev ? 'webpack/hot/poll?300' : null,
                /\.(eot|woff|woff2|ttf|otf)$/,
                /\.(svg|png|jpg|jpeg|gif|ico)$/,
                /\.(mp4|mp3|ogg|swf|webp)$/,
                /\.(css|scss|sass|sss|less)$/,
                /^untranspiled-package/,
              ].filter(Boolean),
            }),
          ]
        : [];
    // return
    return config;
  },
};

λͺ¨λ“  6 λŒ“κΈ€

ν•΄κ²°ν•˜λŠ”λ° μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€. ν–₯ν›„ μ°Έμ‘°:

webpack-node-externals κ°€ SSR 쀑에 적용되고 μ‚¬μš©λ˜λŠ” κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€. 즉, node_modules 의 λͺ¨λ“ˆμ€ λ²ˆλ“€λ§ 및 νŠΈλžœμŠ€νŒŒμΌμ— ν¬ν•¨λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚΄ razzle.config.js μ—μ„œ λ‹€μŒ 쀄을 따라 무언가λ₯Ό μˆ˜ν–‰ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

config.externals = target === 'node' ? [
      nodeExternals({
        whitelist: [
          dev ? 'webpack/hot/poll?300' : null,
          /\.(eot|woff|woff2|ttf|otf)$/,
          /\.(svg|png|jpg|jpeg|gif|ico)$/,
          /\.(mp4|mp3|ogg|swf|webp)$/,
          /\.(css|scss|sass|sss|less)$/,
          /^my-untranspiled-package/
        ].filter(Boolean),
      }),
    ] : [];

...κ·Έ μ½”λ“œμ˜ λŒ€λΆ€λΆ„μ΄ 이 λ¦¬ν¬μ§€ν† λ¦¬μ˜ createConfig.js μ—μ„œ λ°”λ‘œ λ³΅μ‚¬λ©λ‹ˆλ‹€.

@z κ°μ‚¬ν•©λ‹ˆλ‹€!!

@zth μ²˜μŒμ— ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ μ–΄λ–»κ²Œ μž‘λ™ν•˜κ²Œ ν–ˆμŠ΅λ‹ˆκΉŒ? ꡬ성을 κ³΅μœ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

μ•Œκ² μŠ΅λ‹ˆλ‹€. babel-loader 의 포함을 ν™•μž₯ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ λ³€ν™˜λ˜μ§€ μ•Šμ€ νŒ¨ν‚€μ§€ λ‚΄μ˜ .babelrc 에 μ§€μ •λ˜μ§€ μ•ŠλŠ” ν•œ babelOptions 을 λͺ…μ‹œμ μœΌλ‘œ μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ•± νŒ¨ν‚€μ§€μ— /babelrc κ°€ μžˆλŠ” κ²ƒλ§ŒμœΌλ‘œλŠ” μΆ©λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ 전체 ꡬ성 μ˜ˆμž…λ‹ˆλ‹€.

'use strict';
const nodeExternals = require('webpack-node-externals');
const fs = require('fs');

module.exports = {
  modifyBabelOptions() {
    return {
      presets: ['razzle/babel'],
      plugins: ['transform-flow-strip-types'],
    };
  },
  modify(config, { target, dev }, webpack) {
    // package un-transpiled packages
    const babelRuleIndex = config.module.rules.findIndex(
      (rule) => rule.use && rule.use[0].loader && rule.use[0].loader.includes('babel-loader')
    );
    config.module.rules[babelRuleIndex] = Object.assign(config.module.rules[babelRuleIndex], {
      include: [
        ...config.module.rules[babelRuleIndex].include,
        fs.realpathSync('./node_modules/untranspiled-package')
      ],
    });
    config.externals =
      target === 'node'
        ? [
            nodeExternals({
              whitelist: [
                dev ? 'webpack/hot/poll?300' : null,
                /\.(eot|woff|woff2|ttf|otf)$/,
                /\.(svg|png|jpg|jpeg|gif|ico)$/,
                /\.(mp4|mp3|ogg|swf|webp)$/,
                /\.(css|scss|sass|sss|less)$/,
                /^untranspiled-package/,
              ].filter(Boolean),
            }),
          ]
        : [];
    // return
    return config;
  },
};

Typescript ts-loader에 λŒ€ν•΄μ„œλ„ @MrLoh 와 λ™μΌν•œ νŠΈλ¦­μ„ μˆ˜ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. allowedPackagesλ₯Ό ν™•μΈν•˜κ³  거기에 νŒ¨ν‚€μ§€ 이름을 μ‚½μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ ν˜„μž¬ λ²„μ „μ˜ Razzle에 μ‚¬μš©μž 지정 config.externalsκ°€ 없어도 μΆ©λΆ„ν•˜μ§€λ§Œ μ›λž˜ @MrLoh μ†”λ£¨μ…˜μ—λ„ 관심이 μžˆμ„ 수 μžˆλ‹€λŠ” 아이디어도 κ³ λ €ν–ˆμŠ΅λ‹ˆλ‹€(config.externals μ‚­μ œ: https:// github.com/jaredpalmer/razzle/issues/842#issuecomment-475722036)

  const allowedPackages = ['my-component']

  const allowedPackagePaths = allowedPackages.map(packageName =>
    fs.realpathSync('./node_modules/' + packageName)
  )

  const tsRuleIndex = config.module.rules.findIndex(
    rule =>
      rule.use && rule.use[0].loader && rule.use[0].loader.includes('ts-loader')
  )

  if (tsRuleIndex === -1) {
    throw Error(
      'This component assumes that you are using ts-loader. If you are not using it, then you might need to check and test code for how would it work with other loaders'
    )
  }

  config.module.rules[tsRuleIndex] = {
    ...config.module.rules[tsRuleIndex],

    include: [
      ...config.module.rules[tsRuleIndex].include,
      ...allowedPackagePaths,
    ],
  }

  delete config.externals

이것은 λ‚˜μ™€ ν•¨κ»˜ μΌν–ˆμŠ΅λ‹ˆλ‹€. 제 μ§ˆλ¬Έμ€ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ ν΄λΌμ΄μ–ΈνŠΈ 및 μ„œλ²„ λ²ˆλ“€μ—μ„œ 볡제되고 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. razzle.config.jsλ₯Ό μ‚¬μš©ν•˜μ—¬ 이 곡톡 νŒŒμΌμ„ μƒˆ 파일둜 μ²­ν¬ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰

κ΄€λ ¨ 문제

Jayphen picture Jayphen  Β·  4μ½”λ©˜νŠΈ

gabimor picture gabimor  Β·  3μ½”λ©˜νŠΈ

MaxGoh picture MaxGoh  Β·  4μ½”λ©˜νŠΈ

panbanda picture panbanda  Β·  5μ½”λ©˜νŠΈ

pseudo-su picture pseudo-su  Β·  3μ½”λ©˜νŠΈ