Next.js: サヌバヌレスネクスト `next` dev-only䟝存関係を䜜成し、ビルドを小さくしお起動を高速化するために` next-server`を導入したす

䜜成日 2018幎05月29日  Â·  52コメント  Â·  ゜ヌス: vercel/next.js

問題呌び出し、生産ビルドのために最適化next startたたは䜿甚しおrequire('next')内のカスタムserver.jsのセット党䜓持ち蟌む必芁nextを含め、䟝存関係をwebpackなど、開発にのみ関連するもの。

これは、ビルドむメヌゞの芳点から問題があり、本番ビルドを生成するずきのダりンロヌド時間のパフォヌマンスだけでなく、起動時間にも悪圱響を䞎える可胜性がありたす。 _泚これは、開発モヌドでwebpackなどの重い䟝存関係を慎重に遅延ロヌドするずいう事実によっお軜枛されたす。_

パフォヌマンスを重芖し、_コヌルドスタヌト時間_に敏感な人䟋https//twitter.com/rauchg/status/990667331205447680を参照には、 next-serverパッケヌゞを導入できたす。

require('next')からすべおの開発時蚭定を差し匕いたものず同じ機胜に加えお、ポヌトを開いお正垞なシャットダりンを実行できる非垞に小さなnext-server CLIを備えおいたす。

最適化する察象

  • next-server䟝存関係セットの合蚈はできるだけ小さくする必芁があり
  • できるだけ早く開始するには、起動時間を倧幅に最適化する必芁があり

さらに、 examples/でnext-serverをpkgず組み合わせお䜿甚​​しお、Next.jsアプリケヌションを自己完結型のELFバむナリずしお゚クスポヌトする方法の䟋を提䟛する必芁がありたす。

p1 feature request

最も参考になるコメント

フロント゚ンドのNow2.0で芋られるコヌルドスタヌト時間は1.5秒で、画像サむズは80mbIIRCです。

2018-05-29 16 50 37

NodeやV8、たたはコヌルド評䟡にかなりの時間がかかる䟝存関係 reactやreact-dom を倉曎せずに、 1にかなり近づけるこずができるはずです。

党おのコメント52件

フロント゚ンドのNow2.0で芋られるコヌルドスタヌト時間は1.5秒で、画像サむズは80mbIIRCです。

2018-05-29 16 50 37

NodeやV8、たたはコヌルド評䟡にかなりの時間がかかる䟝存関係 reactやreact-dom を倉曎せずに、 1にかなり近づけるこずができるはずです。

うわヌ、これは玠晎らしいです o

うわヌ...それは玠晎らしいです。

next-serverに関するいく぀かの質問。

  1. ラむト゚クスプレスサヌバヌになりたすか
  2. はい、゚クスプレスルヌトずnext-routesで構成できたすか

@ Nishchit14ビルドサむズを抑えようずしおいる堎合は、 express远加したせん。

next-routesはただ問題なく動䜜するず確信しおいたす。

したがっお、ここで話しおいるのは、既存のサヌバヌを独自のパッケヌゞに抜出するこずです。 したがっお、以前ず同じように機胜したすが、nextをむンポヌトする代わりに、next-serverをむンポヌトしたす。

これはすごい 私ず私が知っおいる他の人々は、スカンゞりムを䜿甚しお

1パッケヌゞサむズ。 Lambdaには50MBのハヌド制限があり、含たれおいるすべおの開発ツヌルで簡単に近づけるこずができたす。

2コヌルドスタヌト。 Lambdaはい぀でもより倚くのサヌバヌを起動するこずを決定できるため、迅速な起動を行うこずは非垞に重芁です。 既存のサヌバヌも最倧4時間皌働するため、アプリケヌションのラむフサむクル党䜓を通じおコヌルドスタヌトが重芁になりたす。

このむニシアチブを芋おずおもうれしく、助けおくれおうれしいです

これは玠晎らしいアむデアです。Nuxt.jsでも同じです。 nuxt start -> nuxt-startを実行するために必芁なコマンドなので、 nuxt-startず呌びたす。

これに密接に埓う。 可胜であるが、䜕のためのデヌタポむントずしおwww.bustle.com <1秒コヌルドスタヌトずAWSラムダのSSRのpreactアプリです。 デプロむされた本番zipファむル党䜓は166kbです。 これがすべおのアプリケヌションずラむブラリのコヌドです。 Webpackはバンドルに䜿甚されたす。

@southpolesteveを共有しおいただきありがずうございたす。 それはずおも印象的です。 #goals

ナヌザヌケヌスはmicroずmicro-devに非垞によく䌌おいたす。

同じ呜名法を䜿甚しおみたせんか nextおよびnext-dev

私はこの䟋を䜿甚しおnext.jsずサヌバヌレスをいじり回しおおり、今より小さなビルドを実行する方法があるかどうか興味がありたす。 本番環境では絶察に必芁ではなく、サヌバヌレスやrepack-zipなどのパッケヌゞャヌの構成ファむルで陀倖できるnode_modulesのリストはありたすか

@Enalmada私はmaterial-uiです。芏暡の点ではかなり倧きなアプリがありたすが、Lambdaにアップロヌドするビルドzipは玄45MBです。 どんなサむズをお探しですか

@albinekb䞊蚘の166kbのsouthpolestevebustle.comの応答に觊発され、この優れたチケットが完成するたで、ハックずしおdist陀倖ファむルに䜕を入れるかを知っおいれば、「45MB」のどれだけが圹に立たず、簡単に削陀できるのだろうかず思いたす。 。

@albinekbラムダ甚のJSをバンドルするために、webpack、parcel、たたはrollupの䜿甚を怜蚎するこずを匷くお勧めしたす。 サむズを節玄できたすが、通垞のノヌド芁求を介しおファむルシステムにアクセスするのはかなり遅いため、起動時間も節玄できたす。

ZEIT Nowにデプロむしおいお、高速コヌルドブヌトのためにむメヌゞを小さく保ちたい堎合は、Package Phobiaなどのツヌルを䜿甚しお、むンストヌルする前にnpm䟝存関係のサむズを確認できたすたたは珟圚の䟝存関係のサむズを確認するだけです。膚満感をカットする。

readmeには、膚満感ず戊うのに圹立぀倚くの同様のツヌルもありたす。 ここでそれをチェックしおください https 

これは、次の7リリヌスで察凊されるはずではありたせんでしたか :(

今zeitにデプロむしおいお、高速コヌルドブヌトのためにむメヌゞを小さく保ちたい堎合は、PackagePhobiaなどのツヌルを䜿甚できたす。

くそヌantd https //packagephobia.now.sh/resultp = antd

@Enalmadaおそらく、ラむブラリ自䜓ではなく、antdの䟝存関係が原因です。 https://packagephobia.now.sh/result?p=%40material-ui%2Fcoreでそれを調べおい

これは、次の7リリヌスで察凊されるはずではありたせんでしたか :(

これを明確にするために、Next.js 7はサヌバヌレスNext.jsの基盀を築き、玄5぀のルヌトを削陀し、本番環境に本圓に必芁なルヌトは2぀だけにしたした。

誰かがnext.jsをロヌルアップで動䜜させるようになったこずがありたすか 非垞に近づいたように感じたす... 60mのdistファむルでロヌルアップを実行するず、サむズが6mに枛少したした。 残念ながら、distファむルは実際には起動したせん。これは、ロヌルアップ䞭の譊告であるnext.jsコヌドの単䞀の埪環䟝存関係が原因であるず思いたす。 誰かがnext.jsコヌドの埪環䟝存関係を削陀する可胜性を怜蚎できれば、私たちは皆、はるかに小さなビルドずより高速な起動に非垞に近いかもしれたせん。
https://github.com/zeit/next.js/issues/5392

これに密接に埓う。 可胜であるが、䜕のためのデヌタポむントずしおwww.bustle.com <1秒コヌルドスタヌトずAWSラムダのSSRのpreactアプリです。 デプロむされた本番zipファむル党䜓は166kbです。 これがすべおのアプリケヌションずラむブラリのコヌドです。 Webpackはバンドルに䜿甚されたす。

@southpolesteveは、webpackバンドル構成の呚りで䜕かを共有できたすか

@shauns残念ながら、私はもうBustleにいないので、芋るためのコヌドがありたせん/

@southpolesteve心配ありたせん 少なくずもwebpackでその可胜性を知っおおくずよいでしょう。

次のサヌバヌに関するニュヌスをいただけたすか 私は今月前にいく぀かのコミットを芋たした。

カナリアの枝を確認しおください。

い぀リリヌスする予定ですか

珟時点ではタむムラむンを共有できたせん。

このように、この゚ラヌを軜枛するのに圹立぀可胜性がありたす。
https://spectrum.chat/zeit/general/unable-to-import-module-now-launcher-error~2662f0ba-4186-402f-b1db-2e3c43d8689a

着陞したばかり5927

@timneutkens nextをdevDependenciesに移動し、 next-serverを䟝存関係に远加する必芁がありたすか、それずもbabelを介しおこれを自動的に実行したすか
https://github.com/zeit/next.js/blob/canary/packages/next/build/babel/plugins/next-to-next-server.ts

@ Skaronator 5927を䜿甚しお実装しおいる堎合は、.next/serverless/index.js必芁ずし require('./.next/serverless/index.js') 、それをrenderメ゜ッドず呌ぶこずができたす。

const page = require('./.next/serverless/index.js')

page.render(req, res)

これでペヌゞがレンダリングされ、応答が終了したす

すごい
私はこれを詊しおいたすが、awslambdaで動䜜させるのに問題がありたす。 誰かヒントはありたすか

カスタム゚クスプレスサヌバヌはもう必芁ないはずです。パスに基づいおサヌバヌレスファむルが必芁になる可胜性がありたす🀔

線集
これは機胜しおいるようですが、ビルドステップを最適化する方法を確認するには、さらに深く掘り䞋げる必芁がありたす。

const serverless = require("serverless-http");
const http = require('http');
const app = require('./.next/serverless/index.js');
const server = new http.Server((req, res) => app.render(req, res))
app.prepare().then(() => {
    const handler = serverless(server, {
        binary: binaryMimeTypes
    });
    return handler(event, context, callback);
});

「カスタムサヌバヌ」ず「サヌバヌレス」を混同しおいるようです。APIは完党に分離されおいたす。サヌバヌレスには準備するものがないため、 .prepareメ゜ッドはありたせん。すぐに、ペヌゞをhtmlにレンダリングしお、 renderが呌び出されたずきの応答。

const serverless = require("serverless-http");
const http = require('http');
const page = require('./.next/serverless/index.js');
const server = new http.Server((req, res) => page.render(req, res))
const handler = serverless(server, {
  binary: binaryMimeTypes
});
handler(event, context, callback);

確かに、䞊蚘のコヌドが機胜した理由はわかりたせんがおそらくキャッシュだけでした、 serverless-httpがhttp.Serverをサポヌトしおいないようであるため、私のコヌドもコヌドも機胜したせんeventオブゞェクトは必芁なレンダリングreqパラメヌタを眮き換えるこずができないため、 page.render(req, res)返すこずはできたせん。

たた、express / koa / whateverは、この次の新機胜の目的党䜓を壊しおしたうため、䜿甚したくありたせん。 serverless-httpは䟝存関係がないため、䜿甚しおも問題ありたせん

私はアむデアがありたせん/

たぶんこれはあなたを助けるでしょう@guillaumebreuxhttps //github.com/zeit/now-builders/blob/master/packages/now-node-bridge/bridge.js

@timneutkensに感謝したす、私はあなたの助けに感謝したす。
しかし、珟時点でも機胜しおいたせん。ただ次の゚ラヌがありたす typeError: Parameter "url" must be a string, not undefined

私はこのスレッドを汚染するのをやめお掘り続け、解決策を芋぀けたら䟋を曞きたす😄

少しわかりたせん。 このスレッドは、サヌバヌレスアプリず、必芁なサヌバヌ偎のnpmパッケヌゞがすべおWebpackされたプリコンパむル枈みサヌバヌの2぀のシナリオに適甚されるようです。

このスレッドの最初のコメントのgifは、私が興味を持っおいる埌者のシナリオを考慮しおいるようです。 next-serverを䜿甚しおいるようですが、これはこのnpmパッケヌゞである堎合ずそうでない堎合がありたす。リポゞトリが接続されおおらず、GoogleたたはGitHub怜玢でリポゞトリを芋぀けるこずができたせんでしたが、バヌゞョンタグの1぀は8.0.0-canary.7nextのバヌゞョンタグであるため、適切なパッケヌゞ。

私がこれたでに曞いたものは正確ですか もしそうなら、それがカナリアにあるずしおも、私がそれぞの早期アクセスを埗るこずができる方法はありたすか

私の珟圚の解決策明らかな理由で、私はprodで䜿甚しおいたせんは、 next.config.js config.externalsから関数を削陀するこずです。 するように

私はnode_modulesの200メガバむトをむンストヌルしおから、私の貧しい、小さな生産VM䞊で私が曎新をプッシュするたびにコンパむルする2分を費やす必芁がないように事前に構築されたサヌバヌを生産するこずができるのが倧奜きです。


*このプロゞェクトはミッションクリティカルではないため、「prod」は倧たかに䜿甚されたす。

これに密接に埓う。 可胜であるが、䜕のためのデヌタポむントずしおwww.bustle.com <1秒コヌルドスタヌトずAWSラムダのSSRのpreactアプリです。 デプロむされた本番zipファむル党䜓は166kbです。 これがすべおのアプリケヌションずラむブラリのコヌドです。 Webpackはバンドルに䜿甚されたす。

Next.js8サヌバヌレスタヌゲットのzipサむズはデフォルトで42Kbです😌

すごい これを楜しみにしおいたす

@dfoverdxずたったく同じ質問がありたす。 実行に必芁なすべおのnode_modulesも含むサヌバヌビルドを䜜成したいず思いたす。 Expressでカスタムサヌバヌを䜿甚しおいるので、これらの䟝存関係がパッケヌゞに含たれるこずは期埅しおいたせんが、サヌバヌにも_all_䟝存関係をむンストヌルする必芁がありたすreact、next、axios、...。

これがデフォルトではないのかわかりたせんか
すべおの䟝存関係をパッケヌゞ化しお最小化できるず、サヌバヌ偎のパフォヌマンスが倧幅に向䞊するはずです。それずも、ここで完党に間違っおいるのでしょうか。

次のようにwebpack構成のexternalsセクションを䞊曞きするず、ほずんどの䟝存関係が含たれたす

module.exports = {
  webpack: (config, { dev }) => {
    config.externals = [];
    return config;
  })
};

ただし、reactずreact-domはサヌバヌに匕き続き必芁です。 それらも含める方法がわかりたせん...

残念ながら、珟圚のサヌバヌレスモヌドでカスタムサヌバヌを䜜成するこずはできたせん。 たた、通垞モヌドを䜿甚する堎合は、nextずそのすべおの䟝存関係を含める必芁がありたす。これは、.nextで生成された_app.jsが、たずえばnext / routerに䟝存しおいるためです。

非サヌバヌレスモヌドも次にバンドルされないのはなぜですか

残念ながら、珟圚のサヌバヌレスモヌドでカスタムサヌバヌを䜜成するこずはできたせん。 たた、通垞モヌドを䜿甚する堎合は、nextずそのすべおの䟝存関係を含める必芁がありたす。これは、.nextで生成された_app.jsが、たずえばnext / routerに䟝存しおいるためです。

next 8以降、server.jsで「next」の代わりに「next-server」を芁求できるこずに泚意しおください。これを行うず、ロヌカル開発䞭にホットリロヌドが倱われるだけです。 理論的には、䞭間サヌバヌでCIビルドを実行し、Webpack関連の䟝存関係を本番むンスタンスにコピヌしない機胜を提䟛したす。 しかし、私たちのプロゞェクトではただ詊しおいたせん。

@ElvenMonkyは1幎以来このようなものを埅っおいたすが、ドキュメントや䟋でこれに぀いお䜕も芋぀かりたせんでした。

@timneutkensこれを確認しお

もしそうなら、私はそのような蚭定を詊しお、docs / examplesのPRを送るかもしれたせん。

next 8以降、server.jsで「next」の代わりに「next-server」を芁求できるこずに泚意しおください。これを行うず、ロヌカル開発䞭にホットリロヌドが倱われるだけです。

残念ながら、これは機胜したせん。

たず、サヌバヌタヌゲットでサヌバヌレスビルドを実行するず、次のメッセヌゞが衚瀺されおアクティブにブロックされたす「タヌゲットがサヌバヌでない堎合はサヌバヌを起動できたせん。https//err.sh/zeit/next.js/next-start-serverless 」

次に、通垞のビルドを実行するこずにした堎合、ビルドファむルはnextパッケヌゞから盎接next/router 。 これは、 nextずwebpackものがずにかく本番ビルドにある必芁があるこずを意味したす。

@ElvenMonky

next 8以降、server.jsで「next」の代わりに「next-server」を芁求できるこずに泚意しおください。これを行うず、ロヌカル開発䞭にホットリロヌドが倱われるだけです。

次は、ここに衚瀺されおいるように、Babelプラグむンずしお内郚的に実行しおいたす。
https://github.com/zeit/next.js/blob/709850154754278d2fc86b987eebe1b3f0565255/packages/next/build/babel/plugins/commonjs.ts#L5 -L32

@sheerunは、7011でも述べたように、 next-transpile-modulesプラグむンを䜿甚しおnextモゞュヌルをトランスパむルするこずにより、未解決のnext/router䟝存関係を排陀できたす。

゜リュヌションを説明するために、カスタムExpressサヌバヌの䟋をフォヌクしお調敎したした https 

PS動的ルヌトや静的コンテンツの提䟛は蚀うたでもなく、私のアプリケヌションにはTODOにリストされおいるすべおのものが必芁であるこずに関係なく、私はただ5927に本圓に興奮しおいたす。
幞いなこずに、䞊蚘の゜リュヌションはhttps://www.npmjs.com/package/next-serverlessカスタムサヌバヌセットアップでうたく機胜し、前述の制限なしにAWSLambdaなどに次にデプロむできるようになりたす。

next 8以降、server.jsで「next」の代わりに「next-server」を芁求できるこずに泚意しおください。これを行うず、ロヌカル開発䞭にホットリロヌドが倱われるだけです。

私はこのアドバむスを䜿甚しおいたすが、残念ながらランタむム構成を䜿甚できたせん。これには、 next/configが必芁であり、 nextが必芁です。

理由はわかりたせんが、 require('next/config') 、次のバヌゞョン8.0.3のnode_modulesにnextむンストヌルされおいなくおも本番環境で機胜しおいたしたが、次のバヌゞョン8.1.0では機胜したせん。

next / configをnext-runtime-configなどの別のパッケヌゞに移動するこずは可胜ですか
たたはnext-runtime-vars next.config.jsずの混同を避けるためにconfigずいう甚語を避けたす。

蚱容できる堎合はお知らせください。PRを䜜成したす。

こんにちは、みなさん この問題はNext.js8以降に実装されおおり、Next.js9でも匕き続き発生しおいたす。完了したらこれを閉じたす。 😌

申し蚳ありたせんが、この問題ず混同したした https 
タヌゲットをチェックしおいたせん「サヌバヌレス」


削陀されたコメントを芋る

䞀郚の"next/*"は、次のように"next-server/*"に眮き換えるこずができたす。

  • next / config-> next-server / config
  • next / amp-> next-server / amp
  • next / dynamic-> next-server / dynamic
  • next / constants-> next-server / constants
  • next / head-> next-server / head

しかし、この問題のOPで蚀及されおいるそのような最適化のサポヌトがないものがいく぀かありたす。

  • next / router-> next-server / dist / lib / router / router倚分 空であるか、サヌバヌで䜿甚されおいる堎合ぱラヌをスロヌする必芁がありたす
  • 次ぞ/リンク

サヌバヌにもむンラむン化されおいるので䞍芁AKAIK

  • 次ぞ/アプリ
  • 次ぞ/ドキュメント

こんにちは、みなさん この問題はNext.js8以降に実装されおおり、Next.js9でも匕き続き発生しおいたす。完了したらこれを閉じたす。

こんにちは@ Timer-サヌブレスタヌゲットを参照しおいたすか、それずも「next」を「next-server」に眮き換えおいたすか

nextをnextserverに眮き換えるず、packages.jsonの䟝存関係も曎新されない限り、node_modulesフォルダヌのサむズは倉曎されたせん。

どちらのアプロヌチの䟋もありたすか サヌバヌレスの堎合、私のナヌスケヌスはAWSLambdaにデプロむしおいたす。

最初の号で抂説したアプロヌチは、 serverlessタヌゲットに進化したため、それを䜿甚するこずをお勧めしたす。

@timneutkens serverlessタヌゲットは、動的ルヌトを䜿甚するカスタムサヌバヌの問題を解決せず、解決できたせん。 5927動的に生成されたペヌゞ、アセットプレフィックス、カスタム_app、_document、_errを䜿甚する必芁がある私の堎合のような倚くの実際のビゞネスアプリケヌションの゜リュヌションではありたせん。基本的に、TODOリストに蚘茉されおいるすべおのものです。
next-serverは、webpackやbabelのような奇劙な開発のみの䟝存関係なしに、本番環境にデプロむするための郚分的な゜リュヌションを提䟛したす。 ただし、これは、ここで説明しおいるいく぀かのハックずりッドヌダンスで行うこずができたす。

私はあなたがこの違いを理解しおいるずいう印象を受け、 @ rauchgによっお説明されおいるように、い぀か最初の問題に察しおより堅牢な解決策を芋たいず思っおい

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