首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HtmlWebpackPlugin不包括vendor.js

HtmlWebpackPlugin不包括vendor.js
EN

Stack Overflow用户
提问于 2018-01-08 18:35:03
回答 1查看 1.9K关注 0票数 4

我正在努力提高我们网站的加载速度。所以我一直把我的手放在我们的webpack.config上。

经过几次修改后,我现在将模块分开并正确地散列。我还使用HtmlWebpackPlugin从out模板自动生成index.html。

但我还有另外几个问题出现。

  1. vendor.js不会自动添加到模板中。只会自动添加块-public.json和index.hash.js。如果我试图像这样直接加载,我会得到一个

未定义的ReferenceError: webpackJsonp未定义

  1. 手动添加vendor.js后,我得到以下错误:

未定义的ReferenceError: regeneratorRuntime未定义

这是webpack.config:

代码语言:javascript
复制
const webpack = require('webpack');
const path = require('path');

const HtmlWebpackPlugin = require('html-webpack-plugin');
const ChunkManifestPlugin = require('chunk-manifest-webpack-plugin');
const WebpackChunkHash = require('webpack-chunk-hash');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

/* Shared Dev & Production */

const config = {
  context: path.resolve(__dirname, 'src'),

  entry: {
    index: './index.js',
    vendor: ['react', 'react-dom', 'react-router', 'react-redux', 'history', 'react-router-dom', 'redux', 'react-router-redux', 'redux-form', 'lodash'],
  },

  module: {
    rules: [
      {
        test: /\.js$/,
        use: 'babel-loader',
        exclude: /node_modules/,
      },
      {
        test: /\.(ico|jpg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)(\?.*)?$/,
        exclude: /\/favicon.ico$/,
        use: [
        {
            loader: 'file-loader',
            query: {
              name: '[path][name][hash].[ext]',
              publicPath: '/'
            }
        }
        ]
      },
      {
        test: /\.css$/,
        include: path.join(__dirname, 'src/style'),
        use: [
          'style-loader',
          'css-loader'
        ]
      },
      {
        test: /\.(ico)(\?.*)?$/,
        exclude: /node_modules/,
        use: {
          loader: 'file-loader',
          options: { name: '[name].[ext]' },
        },
      },
      {
        test: /\.xml/,
        use: {
          loader: 'file-loader',
          options: { name: '[name].[ext]' },
        },
      },
    ],
  },

  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].bundle.js',
    publicPath: '/',
  },

  resolve: {
    extensions: ['.js'],
    modules: [path.resolve(__dirname, 'src'), 'node_modules'],
  },

  plugins: [
    // New moment.js optimization
    new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en/),

    new webpack.optimize.CommonsChunkPlugin({
            names: ['vendor'],
            filename: '[name].js',
            minChunks: Infinity
        }),

    new webpack.optimize.ModuleConcatenationPlugin(),

    new HtmlWebpackPlugin({
      appMountId: 'app-root',
      inlineManifestWebpackName: 'webpackManifest',
      template: 'templateIndex.html',
      title: 'Our Site',
    }),
  ],

  devServer: {
    historyApiFallback: true,
  },
};

//if (process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test') {
  config.plugins = [
    ...config.plugins,
    new BundleAnalyzerPlugin({analyzerMode: 'static'}),
  ];
//}

//if (process.env.NODE_ENV === 'production') {
  config.output.filename = '[name].[chunkhash].js';
  config.plugins = [
    ...config.plugins,
    new webpack.HashedModuleIdsPlugin(),
    new WebpackChunkHash(),
    new ChunkManifestPlugin({
      filename: 'chunk-manifest.json',
      manifestVariable: 'webpackManifest',
      inlineManifest: true,
    }),
  ];
//}

module.exports = config;

在这一点上,我不确定webpack.config有什么问题。

如何使vendor.js自动添加?

这是模板:

代码语言:javascript
复制
<!doctype html>
<html lang="en">
<head>

  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">

  <title itemprop="name">Our Site</title>

  <base href="/">

  <link rel="apple-touch-icon" sizes="57x57" href="/images/favicon-57x57.png">
  <link rel="apple-touch-icon" sizes="60x60" href="/images/favicon-60x60.png">
  <link rel="apple-touch-icon" sizes="72x72" href="/images/favicon-72x72.png">
  <link rel="apple-touch-icon" sizes="76x76" href="/images/favicon-76x76.png">
  <link rel="apple-touch-icon" sizes="114x114" href="/images/favicon-114x114.png">
  <link rel="apple-touch-icon" sizes="120x120" href="/images/favicon-120x120.png">
  <link rel="apple-touch-icon" sizes="144x144" href="/images/favicon-144x144.png">
  <link rel="apple-touch-icon" sizes="152x152" href="/images/favicon-152x152.png">
  <link rel="apple-touch-icon" sizes="180x180" href="/images/favicon-180x180.png">
  <link rel="icon" type="image/png" href="/images/favicon-32x32.png" sizes="32x32">
  <link rel="icon" type="image/png" href="/images/favicon-192x192.png" sizes="192x192">
  <link rel="icon" type="image/png" href="/images/favicon-160x160.png" sizes="160x160">
  <link rel="icon" type="image/png" href="/images/favicon-96x96.png" sizes="96x96">
  <link rel="icon" type="image/png" href="/images/favicon-16x16.png" sizes="16x16">

  <link type="image/png" href="/images/favicon.png" rel="icon">
  <link rel="icon" href="/images/favicon.ico" />
  <link rel="shortcut icon" href="/images/favicon.png" />

  <link rel="manifest" href="/manifest.webmanifest">

  <noscript>Your browser does not support JavaScript!</noscript>
</head>
<body>
  <div id="app"></div>
</body>
</html>

这是.babelrc (我认为regeneratorRuntime与它相关,只是需要弄清楚如何实现)

代码语言:javascript
复制
{
  "presets": [
    [
      "env",
      { "modules": false }
    ],
    "react",
    "stage-0",
    "stage-2"
  ],
  "plugins": [ "syntax-dynamic-import", "transform-react-jsx", "transform-decorators-legacy" ]
}

根据我在网上所读到的,再生器错误是由于封装冲突造成的。但我看不出这是从哪里来的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-08 19:21:42

根据我的经验:

Uncaught ReferenceError: webpackJsonp is not defined

通常是CommonsChunkPlugin提取的Webpack代码丢失的结果。您可能需要验证该文件是否也被正确注入。

解决方案

我能够通过删除ChunkManifestPlugin来完成这个任务。它和CommonsChunkPlugin之间似乎有冲突。一些我在过去没有经历过的事情,我自己,但是看看我在下面做了些什么,这起作用是:

注意:您还需要包括babel-polyfill才能使重新生成器-运行时在浏览器中工作。

第一:

巴贝尔6

npm install --save babel-polyfill

巴贝尔7

npm install --save @babel/polyfill

然后:

迪夫:

代码语言:javascript
复制
8a9,11
> // To handle the regeneratorRuntime exception
> require('babel-polyfill'); // or @babel/polyfill if Babel 7
> 
15c18,22
<     index: './index.js',
---
>     index: [
>       // To handle the regeneratorRuntime exception
>       'babel-polyfill', // or @babel/polyfill if Babel 7
>       './index.js'
>     ],
82d88
<       filename: '[name].js',
114c120
<   new ChunkManifestPlugin({
---
>   /*new ChunkManifestPlugin({
118c124
<   }),
---
>   }),*/

全webpack.config.js

代码语言:javascript
复制
const webpack = require('webpack');
const path = require('path');

const HtmlWebpackPlugin = require('html-webpack-plugin');
const ChunkManifestPlugin = require('chunk-manifest-webpack-plugin');
const WebpackChunkHash = require('webpack-chunk-hash');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

// To handle the regeneratorRuntime exception
require('babel-polyfill'); // or @babel/polyfill if Babel 7

/* Shared Dev & Production */

const config = {
  context: path.resolve(__dirname, 'src'),

  entry: {
    index: [
      // To handle the regeneratorRuntime exception
      'babel-polyfill', // or @babel/polyfill if Babel 7
      './index.js'
    ],
    vendor: ['react', 'react-dom', 'react-router', 'react-redux', 'history', 'react-router-dom', 'redux', 'react-router-redux', 'redux-form', 'lodash'],
  },

  module: {
    rules: [
      {
        test: /\.js$/,
        use: 'babel-loader',
        exclude: /node_modules/,
      },
      {
        test: /\.(ico|jpg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)(\?.*)?$/,
        exclude: /\/favicon.ico$/,
        use: [
          {
            loader: 'file-loader',
            query: {
              name: '[path][name][hash].[ext]',
              publicPath: '/'
            }
          }
        ]
      },
      {
        test: /\.css$/,
        include: path.join(__dirname, 'src/style'),
        use: [
          'style-loader',
          'css-loader'
        ]
      },
      {
        test: /\.(ico)(\?.*)?$/,
        exclude: /node_modules/,
        use: {
          loader: 'file-loader',
          options: {name: '[name].[ext]'},
        },
      },
      {
        test: /\.xml/,
        use: {
          loader: 'file-loader',
          options: {name: '[name].[ext]'},
        },
      },
    ],
  },

  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].bundle.js',
    publicPath: '/',
  },

  resolve: {
    extensions: ['.js'],
    modules: [path.resolve(__dirname, 'src'), 'node_modules'],
  },

  plugins: [
    // New moment.js optimization
    new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en/),

    new webpack.optimize.CommonsChunkPlugin({
      names: ['vendor'],
      minChunks: Infinity
    }),

    new webpack.optimize.ModuleConcatenationPlugin(),

    new HtmlWebpackPlugin({
      appMountId: 'app-root',
      inlineManifestWebpackName: 'webpackManifest',
      template: 'templateIndex.html',
      title: 'Our Site',
    }),
  ],

  devServer: {
    historyApiFallback: true,
  },
};

//if (process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test') {
config.plugins = [
  ...config.plugins,
  new BundleAnalyzerPlugin({analyzerMode: 'static'}),
];
//}

//if (process.env.NODE_ENV === 'production') {
config.output.filename = '[name].[chunkhash].js';
config.plugins = [
  ...config.plugins,
  new webpack.HashedModuleIdsPlugin(),
  new WebpackChunkHash(),
  /*new ChunkManifestPlugin({
    filename: 'chunk-manifest.json',
    manifestVariable: 'webpackManifest',
    inlineManifest: true,
  }),*/
];
//}

module.exports = config;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48156146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档