reactjs - 无法获得未定义的属性“绑定”。Babel 7 + core-js + IE11
问题描述
问题
我在 react/typescript 内置的实时聊天客户端上工作了一两个月,效果很好,但我们需要添加对 Internet Explorer 11 的支持。
最初在开发过程中,我使用 Webpack 作为构建系统,并且在使用 Typescript 时,我将所有内容都通过ts-loader
.
由于需要支持,Internet Explorer 11
我决定更改为babel 7
,因为现在有很好的 typescript 支持。我希望使用 babel 来填充 IE11。
我相信我已经通过 babel docs 遵循了项目设置指南。然而,在虚拟机中测试 IE11 中的项目时,我仍然收到以下错误:
如果我展开错误,它似乎在一个名为load-script
.
它在包括 Edge 在内的所有其他现代浏览器中仍然可以完美运行,只是 IE11 似乎存在问题。
我不能确定,但似乎它没有对 node_modules 做任何事情。
关于设置的信息(我将在下面包含文件片段):
- 因为我正在使用
babel 7
我不需要使用@babel/polyfill
,而是我正在使用core-js@3.6.5
- 我正在导入
core-js
并regenerator-runtime/runtime
进入路由文件。(虽然debug: true
在我的 babel env 配置中运行时。它告诉我由于使用 . 而删除这些导入useBuiltIns: usage
。)
我试图做的
当检查开发人员工具中的错误时,我将问题追溯到它抱怨的不同依赖项,注释掉导入并暂时卸载。然后它抱怨另一个模块。
这给我的印象是它无法处理导入的依赖项。因此,我尝试exclude: /node_modules/
从webpack.config.js
.
代码示例
包.json
{
"name": "@rradar/chat-client",
"version": "2.2.9",
"description": "",
"main": "dist/main.js",
"scripts": {
"test": "jest --no-cache || true",
"watch": "webpack --watch --mode development",
"build": "webpack --mode production",
"prettier:base": "prettier --parser typescript --single-quote",
"prettier:check": "npm run prettier:base -- --list-different \"src/**/*.{ts,tsx}\"",
"prettier:write": "npm run prettier:base -- --write \"src/**/*.{ts,tsx}\""
},
"bugs": {
"url": "https://git.rradar.com/npm-packages/chat-client/issues",
"email": "adam.bowers@rradar.com"
},
"repository": {
"type": "git",
"url": "https://git.rradar.com/npm-packages/chat-client"
},
"author": "rradar Limited",
"license": "ISC",
"contributors": [
{
"name": "Adam Bowers",
"email": "adam.bowers@rradar.com"
},
{
"name": "Tom Hughes",
"email": "tom.hughes@rradar.com"
}
],
"jest": {
"setupFiles": [
"<rootDir>/config/test.setup.js"
],
"moduleNameMapper": {
".scss$": "<rootDir>/config/SCSSStub.js"
},
"moduleFileExtensions": [
"ts",
"tsx",
"js"
],
"transform": {
"^.+\\.(ts|tsx)$": "<rootDir>/config/test.preprocess.js"
},
"testMatch": [
"**/__tests__/*.(ts|tsx|js)"
]
},
"dependencies": {
"@babel/polyfill": "^7.12.1",
"@fortawesome/fontawesome": "^1.1.8",
"@fortawesome/fontawesome-free-solid": "^5.0.13",
"@fortawesome/fontawesome-svg-core": "^1.2.2",
"@fortawesome/react-fontawesome": "^0.1.0",
"@rradar/grace-api": "^2.2.3",
"classnames": "^2.2.6",
"core-js": "^3.6.5",
"css-loader": "^1.0.0",
"date-fns": "^1.29.0",
"es6-promise": "^4.2.4",
"file-loader": "^1.1.11",
"howler": "^2.0.14",
"js-cookie": "^2.2.0",
"lodash.clonedeep": "^4.5.0",
"mo-js": "^0.288.2",
"node-sass": "^4.14.1",
"pulltorefreshjs": "^0.1.14",
"pusher-js": "^4.2.2",
"react-html-parser": "^2.0.2",
"react-player": "^2.6.2",
"react-redux": "^6.0.0",
"redux": "^4.0.0",
"resolve-url-loader": "^2.3.0",
"uuid": "^8.2.0"
},
"peerDependencies": {
"react": "^16.4.1",
"react-dom": "^16.4.1",
"lodash.clonedeep": "^4.5.0"
},
"devDependencies": {
"@babel/cli": "^7.12.1",
"@babel/core": "^7.12.3",
"@babel/plugin-proposal-class-properties": "^7.12.1",
"@babel/preset-env": "^7.12.1",
"@babel/preset-react": "^7.12.1",
"@babel/preset-typescript": "^7.12.1",
"@types/classnames": "^2.2.7",
"@types/cordova": "0.0.34",
"@types/enzyme-adapter-react-16": "^1.0.2",
"@types/howler": "^2.0.5",
"@types/jest": "^23.3.0",
"@types/js-cookie": "^2.1.0",
"@types/lodash.clonedeep": "^4.5.3",
"@types/node": "^10.5.2",
"@types/pulltorefreshjs": "^0.1.2",
"@types/pusher-js": "^4.2.0",
"@types/react": "^16.9.36",
"@types/react-dom": "^16.0.6",
"@types/react-fontawesome": "^1.6.3",
"@types/react-html-parser": "^2.0.1",
"@types/react-redux": "^7.1.9",
"@types/react-test-renderer": "^16.0.1",
"@types/uuid": "^8.0.0",
"@types/window-or-global": "^1.0.0",
"awesome-typescript-loader": "^5.2.1",
"babel-loader": "^8.1.0",
"enzyme": "^3.3.0",
"enzyme-adapter-react-16": "^1.1.1",
"jest": "^23.4.1",
"jsdoc": "^3.5.5",
"lodash.clonedeep": "^4.5.0",
"minami": "^1.2.3",
"prettier": "^1.13.7",
"react": "^16.4.1",
"react-dom": "^16.4.1",
"react-test-renderer": "^16.4.1",
"sass-loader": "^7.0.3",
"style-loader": "^0.21.0",
"stylelint": "^9.3.0",
"stylelint-order": "^0.8.1",
"ts-jest": "^23.0.1",
"ts-loader": "^4.5.0",
"tslint": "^5.11.0",
"tslint-react": "^3.6.0",
"typescript": "^3.2.2",
"url-loader": "^1.0.1",
"webpack": "^4.43.0",
"webpack-bundle-analyzer": "^3.8.0",
"webpack-cli": "^3.3.11",
"webpack-strip-block": "^0.2.0"
}
}
babel.config.json
{
"presets": [
[
"@babel/env",
{
"targets": {
"chrome": "58",
"ie": "11"
},
"useBuiltIns": "usage",
"corejs": {"version": "3.6.5", "proposals": true},
"debug": true
}
],
"@babel/preset-react",
[
"@babel/preset-typescript",
{
"isTSX": true,
"allExtensions": true
}
]
],
"plugins": [
"@babel/plugin-proposal-class-properties"
]
}
Webpack 配置
const path = require('path');
module.exports = (env, { mode }) => {
const useBundleAnalyzerPlugin = mode !== 'production' || (env && env.local);
if (useBundleAnalyzerPlugin) {
BundleAnalyzerPlugin = require('webpack-bundle-analyzer')
.BundleAnalyzerPlugin;
}
return {
output: {
path: path.resolve(__dirname, 'dist'),
publicPath: '/',
library: 'ChatClient',
libraryTarget: 'amd',
},
optimization: {
usedExports: true,
},
devtool: 'source-map',
externals: {
lodash: 'lodash',
react: 'react',
reactDOM: 'react-dom',
},
module: {
rules: [
{
test: /\.tsx?$/,
use: 'babel-loader'
},
{
test: /\.(png|svg|jpg)$/,
use: [
{
loader: 'file-loader',
options: {
emitFile: true,
name: 'images/[name].[ext]',
},
},
],
},
{
test: /\.(mp3)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 20000,
fallback: 'file-loader',
},
},
],
exclude: /node_modules/,
},
{
test: /\.scss$/,
use: [
{ loader: 'style-loader' },
{ loader: 'css-loader' },
{ loader: 'resolve-url-loader' },
{ loader: 'sass-loader?sourceMap' },
],
},
{
test: /\.tsx|.ts$/,
enforce: 'pre',
exclude: /(node_modules|bower_components|\.spec\.js)/,
use: [{ loader: 'webpack-strip-block' }],
},
],
},
resolve: {
extensions: ['.tsx', '.ts', '.js'],
alias: {
'chat-client': path.resolve(__dirname, '../module/dist/main.js'),
assets: path.resolve(__dirname, 'src/assets'),
},
symlinks: true,
},
plugins: [
...(useBundleAnalyzerPlugin
? [
new BundleAnalyzerPlugin({
openAnalyzer: true,
}),
]
: []),
],
};
};
解决方案
我如何解决问题
在与同事交谈后,他们似乎过去也遇到过类似的问题。通过将以下内容导入根文件来解决此问题。
请记住,您必须先安装这些。
import 'promise-polyfill/src/polyfill';
import 'whatwg-fetch';
推荐阅读
- verilog - 如果我们将异步重置块与同步重置一起使用会发生什么?
- php - PHP str_replace 与 array() 嵌套覆盖替换值
- amazon-web-services - Amazon Web Services 中的监控/警报数据类型
- php - PostgreQL 从多维数组类型的 Json 字段更新数据
- javascript - 从数据库(php)获取数组值
- node.js - Azure 部署 MongoError:身份验证失败
- image - 在 Outsystems Mobile 中显示联系人列表图像
- javascript - 如何使用 chart.js 自定义圆环图
- java - 将数据读入 ArrayList
- javascript - 当输入中的值已更改jQuery时更改另一个值字段