服务器渲染webpack构建之外的脚本标记

dag*_*da1 12 webpack

我是服务器渲染我的反应应用程序像这样:

export default ({ clientStats }: { clientStats: any }) => async (req: Request, res: Response, next: any) => {
  const context: any = {};

  const app = (
    <StaticRouter location={req.url} context={context}>
      <Application />
    </StaticRouter>
  );

  if (context.url) {
    res.writeHead(301, {
      Location: context.url
    });

    res.end();
    return;
  }

  const { styles, js, scripts } = flushChunks(clientStats, {
    chunkNames: flushChunkNames()
  });

  const appString = renderToString(app);
  const { title } = Helmet.renderStatic();

  res.status(200).send(`
    <!doctype html>
    <html lang="en">
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta httpEquiv="X-UA-Compatible" content="IE=edge" />
        <meta charSet="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        ${styles}
        ${title}
      </head>
      <body>
        <div id="root">${appString}</div>
        <script type=\'text/javascript\' src=\'init.js\' defer></script>
      </body>
    </html>
`);
};
Run Code Online (Sandbox Code Playgroud)

如何引用webpack构建之外的脚本?

我有一个init.js很少做的文件,我想引用它.

我在哪里可以放置它,以便在呈现html时,脚本标记解析?

Ame*_*icA 7

这很简单但有点复杂,首先我解释所有方法,然后在代码中显示.

您应该考虑一个文件夹,JavaScript列出他们不在webpack构建的所有文件.然后将它们放入此文件夹,然后将其externals导入webpack配置.然后将其设置为单独的供应商文件,并且绝对输出文件名应该动态生成,因此webpack构建其捆绑包然后将JavaScript文件复制到dist文件夹中.遵循以下:

// webpack.config.js
...
module.exports = {
    ...
    externals: {
        separateFile: `${srcRoot}/outFiles/yourJavaScriptFile.js`,
    },
    ...
};
Run Code Online (Sandbox Code Playgroud)

通过使用上面的代码,您可以考虑文件的JavaScirpt文件夹,并将其webpack作为externals配置导入配置.

现在,您应该将其作为单独的文件与应用程序文件一起导入.见下文:

// webpack.config.js
...
module.exports = {
    ...
    entry: {
        myFile: 'separateFile', // <== its your external imported file
        app: `${srcRoot}/app/index.js`, // <== its your app file
    },
    output: {
        path: '/dist',
        filename: '[name].js' // <== dynamically make your JavaScript files,
                              //      so, in dist folder you can see app.js and
                              //      myFile.js file
    }
    ...
};
Run Code Online (Sandbox Code Playgroud)

当然,您应该将这些文件导入模板函数,因此:

  ...
  res.status(200).send(`
    <!doctype html>
    <html lang="en">
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta httpEquiv="X-UA-Compatible" content="IE=edge" />
        <meta charSet="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        ${styles}
        ${title}
      </head>
      <body>
        <div id="root">${appString}</div>
        <script src="app.js" defer></script>
        <script src="myFile.js" defer></script>
      </body>
    </html>
 `);
...
Run Code Online (Sandbox Code Playgroud)