如何让动态导入在 webpack 4 中工作

Coc*_*oco 7 javascript webpack babel-loader

我正在尝试将我的应用程序迁移到 webpack 4。我的头已经很痛了。

动态导入- 这是我的代码拆分方法(逐页)。但我无法让它工作。使用以下软件包设置了非常简单的测试仪:

"devDependencies": {
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.4",
    "babel-plugin-transform-async-to-generator": "^6.24.1",
    "babel-polyfill": "^6.26.0",
    "babel-preset-env": "^1.7.0",
    "babel-preset-react": "^6.24.1",
    "css-loader": "^0.28.11",
    "html-loader": "^0.5.5",
    "html-webpack-plugin": "^3.2.0",
    "mini-css-extract-plugin": "^0.4.0",
    "react": "^16.4.1",
    "react-dom": "^16.4.1",
    "webpack": "^4.12.0",
    "webpack-cli": "^3.0.8",
    "webpack-dev-server": "^3.1.4"
  }
Run Code Online (Sandbox Code Playgroud)

这是我的主要测试应用程序:

import React from "react";
import ReactDOM from "react-dom";
import style from "./main.css";
import pageLoader from './pageLoader';

class App extends React.Component {
    render() {
    let page = pageLoader();  
  return (
    <div>
      <p>React here!</p>
      {page}
    </div>
  );
}
};

export default App;
ReactDOM.render(<App />, document.getElementById("app"));
Run Code Online (Sandbox Code Playgroud)

我的页面我想用单独的包动态加载。

import React from "react";
import ReactDOM from "react-dom";
import style from "./main.css";

const Page1 = () => {
  return (
    <div>
      <p>Page1 here!</p>
    </div>
  );
};
export default Page1;
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我的 webpack.config:

const path = require('path');
const HtmlWebPackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = {
  entry: {
    polyfill: 'babel-polyfill',
    app: './src/index.js'
  },
    output: {
        filename: '[name].bundle.js',
        chunkFilename: '[name].bundle.js', //name of non-entry chunk files
        path: path.resolve(__dirname, 'dist')
    },

    module: {
        rules: [
            {
                test: /\.(js|jsx)$/,
                exclude: /node_modules/,
                use: {
                    loader: "babel-loader"
                }
            },
            {
        test: /\.html$/,
        use: [
          {
            loader: "html-loader",
            options: { minimize: true }
          }
        ]
      },
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, "css-loader"]
      },

        ]
    },

    plugins: [
    new HtmlWebPackPlugin({
        template: "./src/index.html",
        filename: "./index.html"
    }),
    new MiniCssExtractPlugin({
      filename: "[name].css",
      chunkFilename: "[id].css"
    })
    ]
};
Run Code Online (Sandbox Code Playgroud)

现在这是构建错误的部分。这是调用动态导入的函数:

function pageLoader() {
    return import(/* webpackChunkName: "page1" */ './Page1')
    .then(page => {
    return page.default;
    });

}

export default pageLoader;
Run Code Online (Sandbox Code Playgroud)

我在构建时收到此错误:

ERROR in ./src/test/pageLoader.js
Module build failed (from ./node_modules/babel-loader/lib/index.js):
SyntaxError: Unexpected token (2:8)

  1 | function pageLoader() {
> 2 |   return import(/* webpackChunkName: "page1" */ './Page1')
    |          ^
  3 |   .then(page => {
  4 |     return page;
  5 |   });
Run Code Online (Sandbox Code Playgroud)

我读过的一切都说这是设置它的方法。我究竟做错了什么?

use*_*158 6

我遇到了同样的问题,修复方法是:

npm install --save-dev @babel/plugin-syntax-dynamic-import
Run Code Online (Sandbox Code Playgroud)

将以下行添加到.babelrc

"plugins": ["@babel/plugin-syntax-dynamic-import"],
Run Code Online (Sandbox Code Playgroud)

资料来源: