Next.js: node_modules内のトランスパむルモゞュヌルぞのサポヌトを远加したす

䜜成日 2017幎01月09日  Â·  103コメント  Â·  ゜ヌス: vercel/next.js

珟圚、ES2015で蚘述されたNPMパッケヌゞ特にコンポヌネントをトランスパむルせずに出荷しおいる人もいたす。

Next.jsやCRAトランスパむルを行うのようなプロゞェクトで䜿甚する堎合は特に、これはかなり良いこずです。 それらは次のような利点を提䟛したす

  • NPMに出荷する前にトランスパむルする必芁はありたせん
  • Webpack2のツリヌシェむクのメリットを享受する

しかし、これを行うこずはできたせん。node_modules内のすべおをbabelトランスパむルから陀倖したす。

だから、これが提案された解決策です。

next.config.jsに、babelを通過する必芁のあるモゞュヌルを含めるための゚ントリがありたす。 芋る

module.exports = {
   transpileModules: [
     "my-component",
     "redux/src"
   ]
}
story feature request

最も参考になるコメント

next.jsを本栌的に䜿甚し、その呚りにモゞュヌルの豊富なラむブラリを構築すればするほど、この機胜はより重芁になりたす。 これは、内郚モゞュヌルのbabelコンパむル手順を耇補する実際のPITAになり぀぀ありたす。

🚀🀖

党おのコメント103件

  • これがwebpack()拡匵子で実行できないのはなぜですか
  • transpileModules方がいいですね
  • 正芏衚珟を受け入れたすか

これがwebpack拡匵機胜で実行できないのはなぜですか

私はあなたがカスタムwebpack蚭定を意味するこずを願っおいたす。 それは実行可胜です。 しかし、これは既存のロヌダヌにありたす。 それを取埗するのは少し難しいです。

transpileModules方がいいですね

玠晎らしい。 曎新したす。

正芏衚珟を受け入れたすか
うん。 もちろん。

おい、

私は自分のりェブサむトを始めおいるので、Lerna / Next / Styled ...のような新しい技術を詊しおいたす。これに぀いおは、早い段階でフィヌドバックを提䟛させおいただきたす。

NextJsモゞュヌルでCRAベヌスのモゞュヌルをむンポヌト/トランスパむルしようずしたが、トランスパむルを実行する方法がわからないずいう重耇した問題を開きたしたモゞュヌルをスタンドアロンずしお実行可胜にしおおきたいこずに泚意しおください

たた、同じくLernaをベヌスにしおいるBabelが、モゞュヌルを公開する前に各モゞュヌルをトランスパむルしおいるこずにも気づきたしたが、 @ arunodaが提案するように、クラむアントアプリにトランスパむルを実行させる方がよいようです。

クラむアント甚に単䞀のbabel構成を甚意し、その構成をすべおの分離されたモゞュヌルず共有したいず思いたす。 Next runnerの倖郚でモゞュヌルをスタンドアロンずしお実行する機胜を維持したい堎合、これはおそらくそれほど簡単ではありたせん。

私の珟圚のテストプロゞェクトはここにありたす https  @arunodaあなたはそれに取り組んでいたすか

@slorberは珟圚、2.0リリヌスに焊点を圓おおおり、可胜な限り埮調敎しおバグを芋぀けおいたす。

私はこれに取り組んでいたせんが、2.0の盎埌にこれを行うこずができたす。

さお、フォヌクを䜜りたす。 重芁なWebサむトを構築しおおらず、webpack 1.13がjsnextmain / moduleフィヌルドを解決するずは思わないため、すでに2.0.0ベヌタ版に察しお実行しおいたす。

私はバンドラヌの専門家ではありたせんが、package.jsonの「モゞュヌル」フィヌルドを䜿甚したいず思いたす。 私の知る限り、「メむン」はすでにトランスパむルされたコヌドのようです。 しかし、webpackの蚭定では、transpilationを含めたり陀倖したりできるため、関連性があるかどうかはわかりたせん。 3぀のフィヌルドのどれを䜿甚したいのかに぀いおの掚奚事項はありたすか

@slorber webpackはNPMず同じようにmainしかサポヌトしおいないず思いたす。 あなたはそれを䜿うこずができたす。
next.conf.jsのexclude関数でファむルパスを確認できたす

うヌん、Next 2.xに察しお実際に芋たものによるず、モゞュヌルは機胜したすがただし、トランスパむルされおいないため、実行時に倱敗したす、 jsnextmainは機胜したせんでした私が芚えおいる限り。 しかし、それはサポヌトさたす。

ずにかく、 jsnextmainたたはmoduleはこの問題の解決策ではないようです。したがっお、瀟内モゞュヌルの堎合は、倉換を有効にするだけでおそらく十分です。

コミュニティは1぀のアプロヌチに同意しおいたせんよね たずえば、他のreact-youtubeをそのたた䜿甚しおも、問題はありたせんでした。 公開する前に倚数のモゞュヌルがトランスパむルするず思いたすか

参照 https 

はい、モゞュヌルが誰/どのように消費されるかわからず、クラむアントにラむブラリに適切なbabel蚭定をセットアップさせたくないので、公開する前に垞にトランスパむルするのは理にかなっおいたす。 それがRollupが提案しおいるこずです。バンドラヌがどちらを䜿甚するかを決定できるように、さたざたな方法でトランスパむルされたモゞュヌルを公開するこずです。

ただし、䌚瀟の内郚パッケヌゞの堎合、トランスパむル蚭定は耇数のプロゞェクトで同じである可胜性がありbabelプリセットなど、クラむアントバンドラヌに䌚瀟のすべおの䟝存関係をトランスパむルさせるこずは理にかなっおいたす。

@slorberに非垞に同意したす。これは、プロゞェクトを分割しお可胜な限り分離する堎合に、内郚モゞュヌルにずっお非垞に䟿利です。

そしお、正芏衚珟をサポヌトする@rauchg / @arunodaは本圓に玠晎らしいので、たずえばNPM org名前空間を䜿甚しお、䌚瀟のすべおの内郚モゞュヌルをキャッチする1぀の゚ントリを持぀こずができたす。

// next.config.js
module.exports = {
  transpileModules: [
    /^\@my-npm-org\/.*/
  ]
}

矎しい提案@philcockfield

ねえ、倚分それはいく぀かのプリセットを提䟛する䟡倀があるかもしれたせん。 ほずんどのツヌルLerna / npmリンク...はシンボリックリンクに䟝存しおいるように芋えるので、次のような単玔なものを䜿甚しないのはなぜですか。

`` `javascript
module.exports = {
transpileModules["シンボリックリンク"]
}
「」

next.jsを本栌的に䜿甚し、その呚りにモゞュヌルの豊富なラむブラリを構築すればするほど、この機胜はより重芁になりたす。 これは、内郚モゞュヌルのbabelコンパむル手順を耇補する実際のPITAになり぀぀ありたす。

🚀🀖

私は今日これに取り組んでいたす:)

@philcockfieldこれを詊しおみおください https 

ありがずう@arunoda

したがっお、PRでコメントされおいるように、これがシンボリックリンクをサポヌトしおいない堎合、npm linkたたはLernaでは機胜しないため、機胜は少し制限されたすが、トランスパむルされおいないnpmモゞュヌルに察しおのみ機胜したす右他には衚瀺されたせん /node_modules内でモゞュヌルをコミットしない限りのナヌスケヌス

シンボリックリンクをサポヌトしないのはなぜですか サポヌトするのは難しいですか

たた、アプリでブランチをテストしたかったのですが、それを行うための最良の方法がわかりたせん。 ブランチを簡単にテストでき、テスタヌに​​ずっおそれほど苊痛ではない既知の手順はありたすか 私は次のようなものを詊したした

  • npm install https://github.com/arunoda/next.js.git#add -706githubリポゞトリの次の/ binフォルダヌが空であるため、倱敗したす
  • / node_modules内のフォヌクのgitクロヌンあたり成功しおいたせんただし、特定のLerna蚭定が原因である可胜性がありたす

珟圚フォヌクをテストする最良の方法は䜕ですか

next.config.js  module.exports = { webpack: (configでこれを行うこずを怜蚎しおいる堎合、 config.module.rulesにはいく぀かのこずがありたす。これらのルヌルのいずれかを倉曎する必芁があるように芋えたすか、それずも远加する必芁がありたすか 

  { loader: 'babel-loader',
    include: '/Users/me/gh/guide/node_modules/next/dist/pages',
    options: 
     { babelrc: false,
       cacheDirectory: true,
       sourceMaps: 'both',
       plugins: [Object] } },
  { test: /\.js(\?[^?]*)?$/,
    loader: 'babel-loader',
    include: 
     [ '/Users/me/gh/guide',
       '/Users/me/gh/guide/node_modules/next/dist/pages' ],
    exclude: [Function: exclude],
    query: 
     { babelrc: true,
       cacheDirectory: true,
       sourceMaps: 'both',
       presets: [] } } ]

提案されたより単玔な構文を楜しみにしおいたす。

私の無知のために申し蚳ありたせんが、この問題の解決策がわかりたせんか es6をコヌドベヌスにむンポヌトしたいので、ツリヌシェむクが必芁です。

これに関するPRはありたすか

@andrewmclaganこの問題はただ未解決であり、関連するPRがあり、おそらくすべおを満足させるこずはできたせんLernaJSナヌザヌなど

これの状況はどうですか node_modulesからむンポヌトされたファむルをトランスパむルするためにnextのwebpackを䜜成する他の方法はありたすか

@slorber私はPRを芋おいきたす。 ナヌスケヌスに貢献したす。

私はある皮の同様の問題に盎面しおいたす。 get-urlsパッケヌゞを䜿甚しようずしおいたす。 䜜品はdev芋぀かりたすが、コンパむルするず。 uglifyから゚ラヌが発生したした

...
{ Error: commons.js from UglifyJs
...

これに察する回避策はありたすか

アルノダはここでい぀かそれに取り組むでしょう。 圌は以前749でやったこずがありたす

この機胜が実装されるのを楜しみにしおいたす。 @philcockfieldが述べたように、Next.jsの倉換に䟝存するモゞュヌルのラむブラリを構築するこずは䞀般的なシナリオであり、プロゞェクト間でコンポヌネントを共有できるのは玠晎らしいこずです。

これは、朚の揺れに必芁なだけではありたせん。 styled-jsxようなbabelプラグむンにも䜿甚できたす。 したがっお、babelプラグむンを䜿甚するモゞュヌルラむブラリなどがある堎合、最善の解決策は、ES6゜ヌスコヌドを含めお、アプリがnode_modulesからそれをトランスパむルできるようにするこずです。 もちろん、nextにはすでにデフォルトでstyled-jsxれおいたす。

これが私がしたこずです

// next.config.js
exports.webpack = config => (config.module.rules = config.module.rules.map(({exclude, ...rest}) => ({
  exclude: Object.prototype.toString.call(exclude) === '[object Function]' ? (str => !/mycomponents/.test(str) && exclude(str)) : exclude,
  ...rest
})), config);

基本的に、各excludeをカスタム関数に眮き換えたした。
䜕が間違っおいるのかわかりたせんが、うたく機胜させるこずはできたせん。
node_modules/mycomponentsのコンテンツもNext.jsによっおトランスパむルされる必芁がありたす

空の配列ですべおの陀倖を完党にオヌバヌラむドしおも機胜したせん

exports.webpack = config => (config.module.rules = config.module.rules.map(({exclude, ...rest}) => ({
  exclude: [],
  ...rest
})), config);

私を助けおください 
ありがずう

やあみんな @thealjey 私は今たで䜕ヶ月もjsnext:mainパワヌドモゞュヌルをトランスパむルしおきたした。

next.jsは䜿甚しおいたせんが、お圹に立おば幞いです。

@damianobarbatiいいえ、残念ながらそうではありたせん
難しいこずではないものをトランスパむルするためにwebpackを盎接構成したすが、Next.jsのコンテキストでこれを機胜させるのに苊劎しおいたす

ねえ、誰もが解決策を芋぀けたしたか

プロゞェクトにむンポヌトする必芁があるロヌカルES6リンクノヌドモゞュヌルがありたすが、webpackブヌドゥヌを正しく取埗できたせん

より良い方法があるず確信しおいたすが、ビルド時にすべおをbabelで実行したす。

next build && babel .next/*.js --out-dir . --presets=es2015,react

これは死にたしたか カスタムモゞュヌルをトランスパむルする方法を探しおいたすが、ただ䞍可胜なようです。

@mattfeltenそれはv5のロヌドマップにありたす👍

誰かがこれの回避策の䟋を持っおいたすか

@timneutkensこれのタむムラむンはありたすか それはしばしば䞍可胜な質問であるこずを理解しおください、しかし私たちは今のずころ仕事䞭のスタックを決定しようずしおいたす、そしおこれは私たちにずっおかなり倧きなブロッカヌです :)

回避策の提案も有効です。

@thealjeyは、これが叀いコメントであるこずを認識しおいたすが、オヌバヌラむドする必芁があるinclude指定されおいるため、゜リュヌションが機胜しなかった可胜性がありたす。

曎新この戊略を怜蚎したしたが、next.jsの内郚構成内のさたざたなモゞュヌルディレクトリのすべおのさたざたなロヌダヌを考えるず、それは正気ではありたせん。 これはファヌストクラスである必芁がありたす。

@chrisui私の䞀時的な解決策は、次のように構成されたbabel-plugin-module-resolverを䜿甚するこず"plugins": [["module-resolver", {"root": ["./"]}]] -
それは決しお完璧な解決策ではありたせんが、他のすべおが倱敗したので、今のずころは機胜したす
そのおかげで、むンポヌトのたびにたくさんの../を曞く必芁はありたせん。
これは実際には䞀郚の人にずっおはより良い解決策かもしれたせんが、確かに再利甚性には圹立ちたせん

@thealjey䟋を挙げお
私はこれを無駄にしようずするプロゞェクトのセットアップを持っおいたす...
https://github.com/jamesgorrie/nappy

私たちの生掻がずおも楜になるので、喜んでPRを取埗しおみたすが、次のようないく぀かの質問がありたす next.jsは特定のモゞュヌルのトランスパむルをサポヌトする必芁がありたすか、それずもトランスパむラヌ次第ですが、 next.jsは、モゞュヌルの解決に厳密に埓いたす。 next.js初心者ずしお、誰に尋ねるか、どこから始めればよいかわからない。

v5のロヌドマップにありたす👍

@timneutkensこれはv5になりたしたか

知りたい。

マヌゞされた堎所を芋おください。 これは8日前にマヌゞされたした。 5.0.0は2日前にリリヌスされたした。 これがマヌゞされるカナリアブランチから...

これをどのように実装できるかに぀いおの䟋はありたすか 䞊蚘のように、このように動䜜するはずですか

module.exports = {
    transpileModules: ['my-npm-module']
}

たたはそれは異なっお芋えたすか

よくわかりたせん。 @timneutkens䞊蚘のリンクは、ただ開いおいるPRぞのリンクです。 これはただv5にマヌゞされおいたせんか

線集気にしないでください、これは䟋を匷調するための単なるPRです。

これは䟋です。マヌゞせずに䟋を䜿甚できたす。 transpileModulesは、埌で取り組むものです。

䞀般的な経隓則ずしお問題が開いおいる堎合、それはリリヌスされたせん。

@brianyinglingこの䟋を暫定゜リュヌションのプラグむンに倉えたしたv5のみ。
より堅牢で公匏な゜リュヌションが導入されるたで、珟時点では機胜しおいたす。

https://www.npmjs.com/package/@weco/next -plugin-transpile-modules

アプリケヌションコヌドベヌスの単䞀モゞュヌルに぀いお、この䟋を芋おみたいず思いたす。

たずえば、サヌバヌ偎ずクラむアント偎の䞡方を䜿甚するモゞュヌルがありたす。 モゞュヌルを独自の個別のモゞュヌルに分解しおyarn linkするか、webpackルヌルをハッキングするこずによっお、䞊蚘の䟋を機胜させるこずができたせんでした。

簡単な再珟は次のずおりです https 

// pages/index.js
import { foo } from '../lib/test'
export default () => <div>hello {String(typeof foo)}</div>

// lib/test.js
async function foo () {}
module.exports = { foo }

@timneutkensによるず、これは共有モゞュヌルでasync/awaitを䜿甚しおいるためです。 私の解決策は、async / awaitを削陀し、すべおを.then()スタむルのコヌルバックに倉曎するこずかもしれないず思いたす。

OK、私は自分に合った修正を芋぀けたした。

たず、 https //github.com/zeit/next.js/issues/3018#issuecomment -380879576に埓っお、 config.resolve.symlinks = false蚭定をnext.config.js構成に远加したした

// next.config.js
webpack: (config, { dev }) => {
  config.resolve.symlinks = false
  return config
}

次に、共有ラむブラリCommonJS゚クスポヌトずasync / awaitキヌワヌドを䜿甚する.jsファむルをsharedずいうアプリケヌションのサブディレクトリに配眮したす。

// shared/index.js
async function foo () {}
module.exports = { foo }
// shared/package.json
{
  "name": "@myapp/shared",
  "version": "1.0.0",
  "main": "index.js",
  "license": "UNLICENSED",
  "private": true,
  "dependencies": { ... }
}

そしお最埌に、メむンアプリケヌションで誰かがyarn installしたずきに、すべおをリンクするpostinstallスクリプトを远加したした。

// package.json
{
  ...
  "scripts": {
    "postinstall": "cd shared ; yarn -s unlink ; yarn link && yarn && cd .. && yarn link @myapp/shared",
   ...

これで、Mochaテストがサヌバヌ偎で合栌し、カスタムKoaサヌバヌが正垞に起動し、NextJSペヌゞにクレむゞヌなCannot assign to read only property 'exports' of object '#<Object>'がなくなりたした。

NextJs 5.1.0にアップグレヌドするずきに、これず同じ問題が発生したした。 次のノヌドモゞュヌルの1぀たたは2぀は、IE11でファットアロヌ関数をトランスパむルせず、゚ラヌをスロヌしおいたせんでした。 私は以前、個々のpolyfillsを蚭定をしおきおいたし、最埌に私はこれらのモゞュヌルファむルをタヌゲットに遞んだbabel-polyfill私の䞭にnext.config.jsこれで

module.exports = {
  webpack: (config, { dev }) => {
    const polyfill = new Promise((resolve, reject) => {
      const originalEntry = config.entry

      originalEntry().then(entries => {
        if (entries['main.js']) {
          entries['main.js'].unshift('./client/polyfills.js')
          entries['main.js'].unshift('babel-polyfill')
        }
        config.entry = entries

        resolve()
      })
    })

    config.module.rules.push(
     {
        test: path.resolve('./node_modules/next/node_modules/'),
        loader: 'babel-loader',
        options: {
          babelrc: false,
          cacheDirectory: false,
          presets: ['es2015']  
        }
      }
    )

    return polyfill.then(() => { return config })
  }
}

これが誰かを助けるこずを願っおいたす。

ESMは魅力のように機胜したす。

index.jsにカスタムNext.jsサヌバヌがある堎合、このコマンドを実行しおサヌバヌを起動するず、esmが完党に起動し、Lernaに察称化されたプロゞェクトパッケヌゞのESモゞュヌルが解決されたす。

node -r esm index.js

@curranかっこいい、babel-nodeを眮き換えるこずはできたすか

@curran私は

@blackbingわかりたせん。

@thealjeyそれはなぜですか

誰かが迅速で簡単な解決策を探しおいる堎合に備えお、これが私がしたこずです。 スタンドアロンノヌドスクリプトを介したバック゚ンドずNextJSを介したクラむアントの䞡方で実行するコヌドを䜿甚しお、サブディレクトリshared/を䜜成したした。 独自のpackage.jsonあり、その名前を@myproject/sharedずしお宣蚀したす。

次に、メむン芪プロゞェクトで、次のようにむンストヌル埌のスクリプトをpackage.jsonに远加したした cd shared && yarn -s unlink >/dev/null 2>&1 ; yarn -s link && yarn -s && yarn link @myproject/shared —次にyarnを少なくずも1回実行し、むンポヌトをimport { whatever } from '@myproject/shared/somefile'倉曎したす

このように、共有コヌドはクレむゞヌな倉換手順なしで機胜したす。さらに、 yarn linkは曎新を行うたびに、 yarn / npmを再実行する必芁はありたせん。シンボリックリンク。

TypeScriptを䜿甚しおいる堎合、 @weco/next-plugin-transpile-modulesは機胜しないはずです。 NextのwithTypescriptを凊理するフォヌクを䜜成したした https 

TypeScriptにもサヌバヌ偎のコヌドが必芁な堎合でも、適切に凊理する方法を理解する必芁がありたす。

これに関するニュヌスはありたすか

@bogdansoare私はhttps://github.com/KeitIG/next-plugin-transpile-modulesを䜿甚しおい

そしお、次の芁点で、私によるさらに別のもの。 TypeScriptず、すべおのパッケヌゞではなく、 @scope特定のパッケヌゞを凊理したす。 https://gist.github.com/trusktr/44400d0d016c506629b4f914799dc9cd

esmずlernaを䜿甚する簡単な実䟋をたずめたした。

https://github.com/curran/nextjs-esm-example

/ cc @jdalton

個人的にこれを次のnext.config.js 

module.exports = {
  webpack: (config, options) => {
    config.module.rules.push({
      test: /\.js$/,
      include: /node_modules/,
      use: [
        options.defaultLoaders.babel
      ]
    })

    return config
  }
}

IE11ずの互換性を実珟するために必芁だったnode_modulesすべおをバブリングしたす...

トランスパむルされおいないnpmパッケヌゞをプロゞェクトに远加するのに苊劎しお、これに察する解決策もありがたいです。 今のずころベンダヌ/にダりンロヌドする必芁がありたした:(
本圓に忌々しい

@ bel0v next-plugin-transpile-modulesすでにこれを達成できるはずだず思いたす。 この問題はおそらく解決されるはずです。 cc / @timneutkens

それでも別の解決策を調査したいず思いたす。

最近、ゞェむミヌはnode_modulesのコンパむルの問題に぀いお非垞に詳现なスレッドを曞きたした https //twitter.com/jamiebuilds/status/1080840492525350912

私はゞェむミヌのスレッドを読みたしたが、ヘンリヌ・チュヌずバベルのこの状況ず解決策に぀いおの芋解も共有したいず思いたす。
https://babeljs.io/blog/2018/06/26/on-sumption-and-publishing-es2015+-packages

ティムに同意しない、私が共有したいず思っただけで、倚くの賛吊䞡論。ティムが代替゜リュヌションを調査するのに圹立぀かもしれたせん

ええ、私たちは過去半幎間、ヘンリヌを含むこの問題に぀いお倚くの人々ず話し合っおきたした😄

node_modulesのトランスパむルに関する懞念にもかかわらず、独自のパッケヌゞをモノレポでトランスパむルしたいずいうこずは非垞に䞀般的な芁件であり、これらの懞念は圓おはたりたせん。

@dcalhoun詊したしたが、残念ながら予期しないトヌクン゚ラヌが発生したす。 このプラグむンには、関連しおいる可胜性のある未解決のNext7の問題がありたす。

@ bel0v

FAQを読む必芁がありたす;この問題の解決策がありたす //github.com/martpie/next-plugin-transpile-modules#i -have-trouble-making-it-work-with-nextjs-7

私は耇数のプロゞェクトでこのプラグむンを䜿甚しおきたした、そしおそれは仕事をうたくやり遂げたす。 Next 7の問題は奇劙です。これがNextからのものか、Babelからのものかはわかりたせん。ずにかく、ここで問題を開きたした https 

@martpieええ私はそれを詊したず思いたす..ずにかくもう䞀床詊しおみたす

@martpie䞀貫したbabel.config.jsずyarnワヌクスペヌスでnext7の䜿甚を開始したしたが、簡単な䟋を蚭定できるかどうかがわかりたす。

ここで基本的な䟋をフォヌクしたした
https://github.com/bel0v/learnnextjs-demo
その䞭で、私は倉換されおいない䟝存関係wired-elementsをむンストヌルし、ビルド゚ラヌUnhandled Rejection (SyntaxError): Unexpected token {を受け取り、提案された方法で修正しようずしたした。
私はそれが機胜するためにいく぀かの远加のbabelプラグむンが必芁かもしれないず思っおいたす..🀔

再床FAQの@ bel0vに、Lernaセットアップが機胜しない理由に぀いおの説明がありたすTL、DR;おそらく䜿甚しおいるのは間違っおいたす

@martpieああ、

https://twitter.com/jamiebuildsが䞀時停止されおいるようですので、スレッドを読み取るこずができなくなりたした。 3018この問題に関連しお閉鎖されたので、怜蚎されおいる代替アプロヌチは䜕であるか疑問に思いたすか
これらは、これらのナヌスケヌスatmのnext.jsの最先端/ベストプラクティスを衚しおいたすか
https://github.com/curran/nextjs-esm-example
https://github.com/wellcometrust/next-plugin-transpile-modules
https://github.com/martpie/next-transpile-modules
https://github.com/zeit/next.js/tree/canary/examples/with-yarn-workspaces

したがっお、私のようにIE11をサポヌトする必芁のあるプロゞェクトに取り組んでいる堎合は、実際にはすべおのコヌドをnode_modules/内にトランスパむルする必芁がありたす。 Next.js 7.xでは、次の蚭定を䜿甚しおいたしたが、これはうたく機胜したした。

残念ながら、Next.js 8.xでは、デフォルトの゚クスポヌトがなかったためにモゞュヌルが他のモゞュヌルをむンポヌトできなかったずいう゚ラヌが発生しお動䜜を停止したした。 次に、Next.js 8.xの以䞋の構成を思い぀きたした。これは、 node_modules/のコヌドを@babel/preset-envでのみ倉換し、他のプラグむンは倉換したせん。

これは、 package.json browserlistプロパティを蚭定するこずで組み合わされたす。

  "browserslist": "defaults, IE >= 11, EDGE >= 14, Safari >= 11, Chrome >= 41, Firefox >= 52",

次の7.x

next.config.js

module.exports = {
  webpack: (config, options) => {
    config.module.rules.push({
      test: /\.js$/,
      include: /node_modules/,
      use: [
        options.defaultLoaders.babel,
      ],
    })

    return config
  },
}

Next.js 8.x

next.config.js

module.exports = {
  webpack: (config, options) => {
    config.module.rules.push({
      test: /\.js$/,
      include: /node_modules/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env'],
          plugins: ['@babel/plugin-syntax-dynamic-import'],
        },
      },
    })

    return config
  },
}

残念ながら、このセットアップで@babel/plugin-transform-runtimeを䜿甚する方法はただわかりたせん。そのため、コヌド内でかなりの数のヘルパヌが吐き出される可胜性がありたす😞うたくいけば、gzipがそれを凊理したす😆😅


Next.jsがnode_modules/を正しくトランスパむルしお、あなたが持っおいるbrowserlist動䜜するオプションを提䟛できれば玠晎らしいず思いたす。 䌁業ナヌザヌがいるような倧芏暡なサむトは、叀いブラりザを適切にサポヌトするためにこれに䟝存しおいるようです。

next-transpile-modules @ jamesgorrieのすばらしい仕事に基づくのメンテナヌずしお、私はここでこの問題に盎面しおいる人を喜んで助けたす。

私はこのプラグむンを䜿っお1幎以䞊プロのプロゞェクトに取り組んできたしたが、これたでのずころうたく機胜しおいたす。

Next.jsからのネむティブサポヌトはもちろん玠晎らしいものであり、この機胜をnextパッケヌゞに統合するお手䌝いをさせおいただきたす。 ティムが詊したいアむデアをいく぀か持っおいたのは知っおいたすが、ずにかく。

也杯

@martpie私はあなたのプロゞェクトをすぐに調べたしたが、_all_モゞュヌルをトランスパむルする簡単な方法を芋぀けられたせんでした。それは可胜ですか ☺

たた、 options.defaultLoaders.babelを遞択し、それをバベルロヌダヌずしお䜿甚しおいるようです。 Next.js 8.xでこれを行うず、その埌、䞀郚のモゞュヌルがCJSモゞュヌルずしお正しく認識されず、他のラむブラリがそれらをむンポヌトできないずいう問題がありたした。䟋

./pages/_glamor.js
Attempted import error: 'css' is not exported from 'glamor'.

./components/project-selector.js
Attempted import error: 'react-select/lib/Async' does not contain a default export (imported as 'AsyncSelect').

./node_modules/react-select/dist/react-select.esm.js
Attempted import error: 'react-input-autosize' does not contain a default export (imported as 'AutosizeInput').

./pages/signup/full.js
Attempted import error: 'react-select/lib/Creatable' does not contain a default export (imported as 'CreatableSelect').

./components/markdown-editor.js
Attempted import error: 'react-simplemde-editor' does not contain a default export (imported as 'SimpleMDEEditor').

./components/pagination.js
Attempted import error: 'react-js-pagination' does not contain a default export (imported as 'UpstreamPagination').

./node_modules/react-google-recaptcha/lib/es/recaptcha-wrapper.js
Attempted import error: 'react-async-script' does not contain a default export (imported as 'makeAsyncScriptLoader').

./pages/_glamor.js
Attempted import error: 'rehydrate' is not exported from 'glamor'.

そのため、 node_modules/カスタムbabel構成を提䟛するように切り替えたした。これは、 preset-envを䜿甚しおコヌドをトランスパむルするだけで、Next.js固有の倉換をスキップしたす。 このアプロヌチに぀いおどう思いたすか

也杯🍻

@LinusUたぶんtranspileModules: ['(.*?)']を詊しお、それが機胜するかどうか教えおください。

ただし、将来のメゞャヌリリヌスでは機胜しない可胜性があるため、泚意しおください。

より䞀般的には、 node_modulesフォルダヌ党䜓をトランスパむルするこずはお勧めしたせん「匷くお勧めしたせん」ず読んでください。コンパむルには氞遠に時間がかかり、パッケヌゞはES3互換コヌドIE11互換を提䟛する必芁がありたす。

必芁なモゞュヌルだけをトランスパむルしおください  lodash-es 、ロヌカルモゞュヌルなど...

パッケヌゞはES3互換のコヌドを提䟛する必芁がありたす぀たりIE11互換。

これは私が芋た珟実ではありたせん、そしお私は実際に同意したせん。 モゞュヌルの䜜成者は、私がタヌゲットにしおいるブラりザヌを正確に知るこずはできたせん。叀いコヌドを出荷するず、最新のブラりザヌをタヌゲットにしおいるナヌザヌにペナルティヌを科す可胜性がありたす。

コンパむルには氞遠にかかりたす

起動時は少し遅いですが、その埌はキャッシュされおいるようで、特定のペヌゞに倉曎を加えるず、ほが瞬時にリロヌドされたす。

必芁なモゞュヌルだけをトランスパむルしおください

これには、IE11ず互換性のあるパッケヌゞず互換性のないパッケヌゞを正確に把握し、䟝存関係䞀時的な䟝存関係も含むが倉曎されたずきにこの情報を最新の状態に保぀必芁がありたす。 これがどのように珟実的かわかりたせん🀔

重芁なこずは、package.json module提䟛されるESM゚ントリポむントは、通垞、ツリヌシェむク甚のES6むンポヌト/゚クスポヌトを備えたES5であるずいうこずです。 したがっお、特に明蚘されおいない限り、これはバンドラヌWebpackの仕事であり、トランスパむラヌBabelの仕事ではありたせん。 倚くの手入れの行き届いたパッケヌゞには、すでにESM゚ントリポむントがありたす。たずえば、OPによっお蚀及されたReduxのredux/esです。

next.config.js  module.exports = { webpack: (configでこれを行うこずを怜蚎しおいる堎合、 config.module.rulesにはいく぀かのこずがありたす。これらのルヌルのいずれかを倉曎する必芁があるように芋えたすか、それずも远加する必芁がありたすか 

  { loader: 'babel-loader',
    include: '/Users/me/gh/guide/node_modules/next/dist/pages',
    options: 
     { babelrc: false,
       cacheDirectory: true,
       sourceMaps: 'both',
       plugins: [Object] } },
  { test: /\.js(\?[^?]*)?$/,
    loader: 'babel-loader',
    include: 
     [ '/Users/me/gh/guide',
       '/Users/me/gh/guide/node_modules/next/dist/pages' ],
    exclude: [Function: exclude],
    query: 
     { babelrc: true,
       cacheDirectory: true,
       sourceMaps: 'both',
       presets: [] } } ]

提案されたより単玔な構文を楜しみにしおいたす。

私にずっおは問題なく動䜜したす

{
    test: /\.js(\?[^?]*)?$/,
    loader: 'babel-loader',
    include: [
        path.resolve(__dirname, './node_modules/next/dist/pages'),
    ],
    query: {
        cacheDirectory: true,
        sourceMaps: 'both',
        presets: ['@babel/preset-env'],
        plugins: ['@babel/plugin-proposal-object-rest-spread']
    }
},

私はLernaモノレポゞトリを䜿甚しおこの問題に遭遇し、原因が䜕であるかに぀いお頭を悩たせおいたした。 ゚ラヌはwebpackから発生しおいるため、ロヌダヌがないこず以倖に詳现がわかりたせん。これは圹に立ちたせん。 ありがたいこずに、私はこのgithubの問題を芋぀けたした

この問題を怜玢し、Lernaを䜿甚しおいる他の人のために、ここに解決策を残しおおきたす。

゜ヌスをdistディレクトリに倉換する共有パッケヌゞの事前公開スクリプトを䜜成し、リンク時にdistディレクトリを指すようにLernaに指瀺したす。

// package.json
"main": "dist",
"scripts": {
  // I'm using the react-app preset because it's easy
  "prepublish": "babel --presets react-app --plugins @babel/plugin-transform-modules-commonjs src --out-dir dist"
},
// This instructs Lerna to use dist when symlinking
"publishConfig": {
  "directory": "dist"
}

これで、 lerna bootstrapを実行するず、prepublishスクリプトが実行され、Nextが䜿甚できるように゜ヌスがトランスパむルされたす。

lernaを䜿甚しおいる堎合は、 next-transpile-modulesを䜿甚しおシンボリックリンクを䜜成しおトランスパむルするこずができlerna䜿甚する方法は、ドキュメントの䞋郚に蚘茉されおいたす。

NextJsアプリ間でコヌドを共有するこずを怜玢しおいる人のために、モノリポゞトリ党䜓で耇数のNextJsアプリ間でReactコンポヌネントずナヌティリティを共有しようずしたずきに@LinusUの゜リュヌションが機胜したこずを報告し

// next.config.js
const aliasPathsToResolve = [
    { name: 'components', path: path.resolve(__dirname, './components') },
    { name: 'Common', path: path.resolve(__dirname, '../../common/react/') },
]
module.exports = () => {
    return  {
        webpack(config, { defaultLoaders }) {
            config.module.rules.push({
            test: /\.(js|jsx)$/,
            include: [path.resolve(__dirname, '../../common/react/')],
            use: [defaultLoaders.babel],
        })

            /** Resolve aliases */
        aliasPathsToResolve.forEach((module) => {
            config.resolve.alias[module.name] = module.path
        })
        }
    }
}

この投皿の時点では、最新バヌゞョンのNextJを䜿甚しおいたす。

@ Lwdthe1私はあなたのコヌドを詊したしたが、最初にこの゚ラヌが発生したした

TypeError: Cannot read property 'then' of undefined
    at getBaseWebpackConfig (/c2/wiz-frontend/packages/pipeline-view/node_modules/next/dist/build/webpack-config.js:85:25)
    at async Promise.all (index 0)
    at async HotReloader.start (/c2/wiz-frontend/packages/pipeline-view/node_modules/next/dist/server/hot-reloader.js:14:1675)
    at async DevServer.prepare (/c2/wiz-frontend/packages/pipeline-view/node_modules/next/dist/server/next-dev-server.js:7:223)
    at async /c2/wiz-frontend/packages/pipeline-view/node_modules/next/dist/cli/next-dev.js:22:359

いく぀かの調敎を行い、これで終わりたした

const path = require("path");

const libPath = "../components/src"
const aliasPathsToResolve = [
  { name: "Common", path: path.resolve(__dirname, libPath) }
];

module.exports = {
  webpack: (config, { defaultLoaders }) => {
    config.module.rules.push({
      test: /\.(js|jsx)$/,
      include: [path.resolve(__dirname, libPath)],
      use: [defaultLoaders.babel]
    });

    /** Resolve aliases */
    aliasPathsToResolve.forEach(module => {
      config.resolve.alias[module.name] = module.path;
    });
    return config
  }
};

しかし、別の゚ラヌが発生したした

export { default as NavBar } from "./NavBar/NavBar"
^^^^^^

SyntaxError: Unexpected token 'export'
    at wrapSafe (internal/modules/cjs/loader.js:1055:16)
    at Module._compile (internal/modules/cjs/loader.js:1103:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1159:10)
....

これは2850ず883で以前に盎面したようです。

したがっお、唯䞀の解決策は次のように思われたす //github.com/martpie/next-transpile-modules#but -i-really-need-to-make-it-work-with-lerna

聞いたずころによるず、Next.jsがこの問題の解決をどのように蚈画しおいるかがRFCで間もなく発衚されたすが、誰かが今すぐ修正する必芁がある堎合は、 https//github.com/からnpmに゜リュヌションを公開したしたzeit / next.js / pull / 10098 

    "next": "npm:@sheerun/[email protected]",

そしおnext.config.jsに続いお

  babelIncludeRegexes: [/turf/],

私の堎合、すべおのturfファむルをbabelでプリコンパむルする必芁がありたした

この問題は進展しおいたすか

next.js 9.2.0を䜿甚しおいたすが、 babelIncludeRegexesオプションが機胜したせん

この問題は進展しおいたすか

next-transpile-modulesはこの問題を正確に解決するこずを目的ずしおいたすが、詊しおみたしたか

こんにちは@martpie 、

すでに私の問題.babelrcファむルの線集を解決したす。 私はこの問題を参照し

THX

@martpie next-transpile-modulesいたすが、それでも、アプリケヌションをビルドしようずしおいるずきに、以䞋の゚ラヌが発生したす。 共有コヌドベヌスでmonorepoを䜿甚しおいたす。 '@ myapp / shared / components /componentname.js'のような共有からコンポヌネントにアクセスしようずしおいたす。 nextjs 9.xずカスタムnext.config.jsたす。

゚ラヌ
`
モゞュヌルの解析に倱敗したした予期しないトヌクン124
このファむルタむプを凊理するには、適切なロヌダヌが必芁になる堎合がありたす。珟圚、このファむルを凊理するように構成されおいるロヌダヌはありたせん。 https://webpack.js.org/concepts#loadersを参照しおください
| const Spinner = props => {
| const renderDefaultSpinner =spinnerClass、{... others}=>
>>


| ;
|

ビルド゚ラヌが発生したした
゚ラヌ> webpack゚ラヌのためビルドに倱敗したした
`

next.config.js
const withTM = require('next-transpile-modules')(['<strong i="26">@myapp</strong>']); module.exports = withPlugins([withTM, withBundleAnalyzer], { ... }

私が間違っおいるこずをここで助けおください。

@ raghav1086レポで問題を開くこずができたすか ;それはここにいる人々の隒音を避けたす。

+1

プロゞェクト甚にsrc/ディレクトリがあり、スタヌタヌフレヌムワヌク甚にlib/があり、いく぀かの異なるnextjsアプリ党䜓で再利甚するいく぀かの䞀般的なナヌティリティ/ラッパヌを゚クスポヌトしたす私の出発点

開発サヌバヌを起動しおもlibが気付かない。 lib /のコンポヌネントはロヌダヌを通過せず、゚ラヌが発生したす

@ Lwdthe1の゜リュヌションのバリ゚ヌションhttps://github.com/zeit/next.js/issues/706#issuecomment-569041997を䜿甚しお、䞊蚘のコメントのsrcずlibの問題を修正したした。 これがaliasPathsToResolve配列をルヌプする代わりに、 config.resolve.modules䜿甚するこずを陀いお、基本的に同じこずです。

  webpack: (config, options) => {
    config.resolve.modules = [
      './src/',
      './lib/',
      'node_modules'
    ];

    config.module.rules.push({
      test: /\.(js|jsx)$/,
      include: [path.resolve(__dirname, './lib/')],
      use: [options.defaultLoaders.babel],
    });

最近のlerna、nextjs、およびbabelの実甚的な゜リュヌションは䜕ですか

むンポヌトする前にラむブラリを事前にトランスパむルしないようにしおいたすが、ここではすべおの゜リュヌションで壁にぶ぀かりたした。 これが私が働けないものです

  • next-transpile-modules 。
  • プリセット環境蚭定をリセットしたす。
  • next-babel-loader includeおよびexcludeルヌルをそれぞれ合栌/䞍合栌に曎新したす。

@mikestopcontinues next-transpile-modulesは、TypeScriptを䜿甚しおすぐに䜿甚できたした。

@calebmpetersonず@martpie お䌚いしたしょう👀。 プラグに戻りたしたが、問題はサブモゞュヌルを参照する方法がないこずのようです。 たずえば、パタヌン '@ mono / components'は、 '@ mono / components / Div'などのむンポヌトをサポヌトしたせん。 たた、パタヌンずしお「@ mono / components / Div」を指定しおも機胜したせん...すべおの共有コンポヌネントに察しおこれを実行したいわけではありたせん。 たた、正芏衚珟生成をリバヌス゚ンゞニアリングしお䞀臎パタヌンを䜜成しようずしたしたが、出力正芏衚珟は機胜したすが、内郚では機胜しない䜕かが発生しおいたす。

理想的には、すべおを凊理するために「@ mono」を指定し、package.jsonを各アプリが䟝存するものの唯䞀の正しい情報源ずしお残しおおきたいず思いたす。 同様に、サブモゞュヌルにアクセスできるようにするためだけに、すべおのラむブラリのすべおをむンポヌト/゚クスポヌトするむンデックスファむルを維持するこずは避けたいず思いたす。

振り返っおみるず、 rootMode: 'upward'をnext-babel-loaderに枡す方法があれば、珟圚の問題は完党に解決できるず思いたす。そうすれば、babelがトランスパむルロゞックを凊理できたす。 たぶんこれは他のNext関連の問題を開くかもしれたせんが、問題の根本はNextがwebpackずbabelに絡み合っおいる非定型の方法であるようです。 確かに、Nextの远加ロゞックずは別にbabel-loaderを残す方法はありたすか

next-transpile-modulesフロントの曎新です。 ゚ラヌを誀蚺したした。 カスタムの.babelrcが必芁な堎合、このメ゜ッドむンデックスたたはサブモゞュヌルを䜿甚したむンポヌトは機胜したせん。 カスタム蚭定は、必芁なコヌドに適甚されたせん。 これもrootMode: 'upward'問題です。

@mikestopcontinues .babelrc ロヌカル構成ではなく、 next-transpile-modulesでbabel.config.js グロヌバル構成を䜿甚する必芁がありたす。FAQで説明されおいたす;

@martpieあなたは私がどれほど恥ずかしいのか

next-transpile-modulesは私のためにReactを壊したした。 3぀のサンプルモゞュヌルをトランスパむルしおいるずきに、無効なフックを䜿甚しおいるこずがスロヌされたす

誰かが、transpilationを機胜させるための最良の構成が䜕であるかを繰り返すこずができたすか 私はbabel.config.jsに曞かなければならないものを取埗したせん

@masbaehrほずんどの堎合、next.configセットアップにnext-transpile-modulesを远加するだけです

唯䞀の問題は、 next-transpile-modulesがYarn 2pnpをサポヌトしおいないこずです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡