使用反应延迟加载时在Edge上出现SCRIPT1028错误

时间:2019-08-05 09:49:54

标签: reactjs webpack lazy-loading microsoft-edge react-suspense

我的应用程序可在其他浏览器上运行,但不能运行(在v44上) 如果我删除延迟加载,则可以正常工作。

我正在使用React.lazySuspense拆分我的代码。

  • babel 7.5.0
  • webpack 4.28.3
  • 反应16.7.0

尝试弄乱webpack和babel配置。 似乎错误是由eval中的以下代码引发的。 我认为这是传播语法正在杀死它。 但是,我不知道如何让babel将其作为webpack代码本身转换为es5。



function reduce(state = {}, action) {
    return {
        dirtyHandlerIds: Object(_dirtyHandlerIds__WEBPACK_IMPORTED_MODULE_3__["default"])(state.dirtyHandlerIds, {
            type: action.type,
            payload: {
                ...action.payload,
                prevTargetIds: Object(_utils_js_utils__WEBPACK_IMPORTED_MODULE_5__["get"])(state, 'dragOperation.targetIds', []),
            },
        }),
        dragOffset: Object(_dragOffset__WEBPACK_IMPORTED_MODULE_0__["default"])(state.dragOffset, action),
        refCount: Object(_refCount__WEBPACK_IMPORTED_MODULE_2__["default"])(state.refCount, action),
        dragOperation: Object(_dragOperation__WEBPACK_IMPORTED_MODULE_1__["default"])(state.dragOperation, action),
        stateId: Object(_stateId__WEBPACK_IMPORTED_MODULE_4__["default"])(state.stateId),
    };
}

webpack配置:

module.exports = {
    entry: './src/index.js',
    output: {
        path: path.resolve(__dirname, '../build'),
        publicPath: '/',
        chunkFilename: '[name].bundle.js',
        filename: 'bundle.js'
    },
    optimization: {
        sideEffects: true
    },
    module: {
        rules: [
            {
                test: /\.(js|jsx)$/,
                exclude: /node_modules/,
                use: ['babel-loader'] // loads js
            },
            {
                test: /\.(ts|tsx)$/,
                exclude: /node_modules/,
                use: ['ts-loader'] // loads ts
            },
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader'] // handles css
            }
        ]
    },
    // gets it to bundle index.html
    plugins: [
        new HtmlWebpackPlugin({
            template: path.resolve('./public/index.html')
        })
    ],
    // makes it able to resolve .jsx calls without explicit suffix
    resolve: {
        extensions: ['.js', '.jsx', '.ts', '.tsx']
    }
};

babel配置

module.exports = {
    presets: [
        '@babel/preset-env',
        '@babel/react'
    ],
    plugins: [
        '@babel/plugin-proposal-class-properties',
        '@babel/plugin-syntax-dynamic-import',
        [
            'import',
            {
                libraryName: 'antd',
                style: true
            }
        ]
    ],
    env: {
        test: {
            plugins: [
                'transform-es2015-modules-commonjs'
            ]
        }
    }
};

预期:像其他浏览器一样在边缘上工作

Actual:撞到会触发延迟加载的东西后立即死亡

2 个答案:

答案 0 :(得分:0)

我更正了Webpack配置更改中的类似问题。

我们按照您描述的方式使用延迟加载,而我几乎遇到了这个确切的问题。由于这个问题,我在eval中发现Edge拒绝使用的传播算子。就我而言,这是由于我们使用了react-svg-loader

我们试图引入一个像JSX这样的svg: import Image1 from 'react-svg-loader!./image1.svg';,在Edge上失败,并显示类似错误。

转换为将加载程序用作我们的webpack配置的一部分已解决了该问题:

// In your webpack config
{
  test: /\.svg$/,
  use: [
    {
      loader: "babel-loader"
    },
    {
      loader: "react-svg-loader",
      options: {
        jsx: true // true outputs JSX tags
      }
    }
  ]
}

// In your lazily loaded component
import Image1 from './image1.svg';

答案 1 :(得分:0)

这对我有用。我在 Edge v44 中加载 React 应用程序时遇到了同样的问题,错误代码相同。我的开发模式浏览器列​​表不包括 IE。

  1. 更新 package.json 中的浏览器列表

{
  ...
  "browserslist": {
    "production": [
      ...
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version",
      "last 1 ie version" // <- make sure this is present
    ]
  },
  ...
}

  1. 删除 node_modules 中的 .cache 文件夹
  2. 重新运行开发服务器