質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.97%

isomorphic-webpackでSSRをしたいが「Error: DllPlugin: supply an Array as entry」

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,104

Buakaw

score 213

NodeJSサーバで、webpackで制作したReactJSをSSRしたいです。
複数のloaderを使用してコンパイルをしているため、webpackのコンパイル環境を生かしたままサーバへあげたいです。設定を実行すると、DllPlugin.jsからエラーが発生し、解決方法が分からず躓いています。ご教授頂けますと幸いです。

// server.js
import React from 'react'
import ReactDom from 'react-dom'
import express from 'express'
import webpackConfiguration from '../webpack.config'
import webpackDevMiddleware from 'webpack-dev-middleware'
import webpack from 'webpack'
import {renderToString} from 'react-dom/server'
import {createIsomorphicWebpack} from 'isomorphic-webpack'

const app = express()

const compiler = webpack(webpackConfiguration)
createIsomorphicWebpack(webpackConfiguration)

const webpackDevMiddlewareInstance = app.use(webpackDevMiddleware(compiler))

const renderFullPage = (body) => {
  return `<!doctype html>
    <html lang="ja">
      <head>
      </head>
      <body>
          <div id="root"></div>
          ${body}
          <script src="/assets/js/bundle.js"></script>
      </body>
    </html>`
}

app
  .get('*', function (req, res) {
    const appBody = renderToString(require(`../src/index.js`).default)
    res.setHeader('content-type', 'text/html')
    res
      .status(200)
      .send(renderFullPage(appBody))
  })

app.listen(3000)
 // webpack.config.js
const path = require('path');
const webpack = require('webpack');

module.exports = {
  entry: path.resolve(__dirname, 'src/index.js'),
  output: {
    path: path.resolve(__dirname, 'public/assets/js/'),
    filename: 'bundle.js'
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: {
          presets: ["es2015", "react"]
        }
      }, {
        test: /\.(css|scss)$/,
        loaders: [
          'style-loader', 'css-loader?modules&localIdentName=[path]___[name]__[local]___[hash:base64:5]!sas' +
              's-loader?modules',
          'autoprefixer-loader'
        ]
      }, {
        test: /\.(jpg|png|svg)$/,
        loaders: 'url-loader'
      }
    ]
  }
}
$ babel-node server.js 
/Users/XXX/node_modules/webpack/lib/DllPlugin.js:22
  throw new Error("DllPlugin: supply an Array as entry");
Error: DllPlugin: supply an Array as entry
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

check解決した方法

0

本家の、https://github.com/gajus/isomorphic-webpackをcloneしてReadmeの手順通りの実行しましたが、デフォルトでERRORを吐いていました。(nodeのバージョン調整するも変わらず。)

本家をcloneして初期でERRORなのは致命的なので、別の方法を検討します。
ご回答ありがとうございます・・

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

webpack のことはよくわからないのですが・・・。

エラーメッセージを見る限り entry が配列でないというエラーのようです。 entry: [path.resolve(__dirname, 'src/index.js')], という感じで配列にしてみてはいかがでしょう?

しかし webpack.config.js には DllPlugin の記述がないのに不思議ですね・・・と思ったら isomorphic-webpack が入れているようです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

skagawaさんと同じ回答になってしまいますが、

DllPluginの対象箇所は以下の通りとなっていて、Array.isArray(item)のときにDLLEntryPluginのインスタンスを返すようになっています。

function itemToPlugin(item, name) {
  if(Array.isArray(item))
    return new DllEntryPlugin(context, item, name);
  else
    throw new Error("DllPlugin: supply an Array as entry");
}

また、DLLEntryPluginのほうもインスタンス変数として渡ってきたentriesを配列の用に扱っています。

class DllEntryPlugin {
  constructor(context, entries, name) {
    this.context = context;
    this.entries = entries; //配列で来たと予想して
    this.name = name;
  }
  //...
  //this.entriesに対してmapとかしてる
  compilation.addEntry(this.context, new DllEntryDependency(this.entries.map((e, idx) => {//...}

なので、entryの部分をentry: [path.resolve(__dirname, 'src/index.js')],のようにして見てほしいです。

ちなみに、webpack自体のentry部分は、StringでもArrayでもHash(key, valueのやつ)でも問題なく動きます。
その為最初僕も意味不明だと思っていたのですが、DllPluginの方ではentryは配列で来ることを予想されていたので、DllPluginを使用する際は配列に限定されてしまうのかもしれないですね。。。

見当違いでしたらスイマセン!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる