Проблема со слабым сайтом на IE11 - PullRequest
0 голосов
/ 04 июня 2018

У меня есть класс, использующий WeakMaps следующим образом

const myWeakMap = new WeakMap();
class myClass {
    constructor(myObject) {
        myWeakMap.set(this, myObject);
    }
    
    getProperty () {
        return myWeakMap.get(this).property;
    }
}

var instance = new myClass({property: 5});
console.log(instance.getProperty());

Это прекрасно работает при использовании chrome, firefox, но в IE это выдает ошибку cannot read property 'property' of undefined, потому что myWeakMap.get(this) равно undefined.Также, когда я использую свойство производственной сборки Webpack, которое делает только код, система работает должным образом в IE.Я не уверен, что отличается или что вызывает проблему, и не уверен, как отладить проблему.Любая помощь будет приветствоваться.

Конфигурация Webpack

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const ExtractTextPlugin = require("extract-text-webpack-plugin");

const BUILD_DIR_CLIENT = path.resolve(__dirname, "build-client");

const APP_DIR = path.resolve(__dirname, "src/client/main");
const SHARED_DIR = path.resolve(__dirname, "src/shared");

const extractCSS = new ExtractTextPlugin("main.css");
const extractLESS = new ExtractTextPlugin("[name].css");
const semanticCssPath = path.resolve(__dirname, "node_modules/semantic-ui-css/semantic.min.css");
const datePickerCssPath = path.resolve(__dirname, "node_modules/react-datepicker/dist/react-datepicker.css");
const elasticBuilderPath = path.resolve(__dirname, "node_modules/elastic-builder");


const ifdefOpts = {
  build: process.env.BUILD_ENV,
  "ifdef-verbose": true,
};

module.exports = {
  entry: {
    index: APP_DIR + "/client.jsx",
  },
  output: {
    path: BUILD_DIR_CLIENT,
    filename: "main_index.js",
  },
  module: {
    rules: [
      {
        test: /\.less$/,
        use: extractLESS.extract(["css-loader?importLoader=2&modules&localIdentName=[name]---[local]---[hash:base64:5]", "postcss-loader", "less-loader"]),
      },
      {
        test: /\.css$/,
        include: [semanticCssPath, datePickerCssPath],
        use: extractCSS.extract(["css-loader"]),
      },
      {
        test: /\.css$/,
        exclude: [semanticCssPath, datePickerCssPath],
        use: extractCSS.extract(["css-loader?importLoader=1&modules&localIdentName=[name]---[local]---[hash:base64:5]", "postcss-loader"]),
      },
      {
        test: /\.(png|woff|woff2|eot|ttf|svg)$/,
        loader: "url-loader?limit=100000",
      },
      {
        test: /\.jsx?/,
        include: [APP_DIR, SHARED_DIR, elasticBuilderPath],
        use: ["babel-loader", "eslint-loader", {loader: "ifdef-loader", options: ifdefOpts}],
      },
    ],
  },
  plugins: [
    extractLESS,
    extractCSS,
  ],
  resolve: {
    alias: {
      "~": path.resolve(__dirname, "src"),
      "@main": path.resolve(__dirname, "src/client/main"),
      "@shared": path.resolve(__dirname, "src/shared"),
    },
    extensions: [".js", ".jsx", ".css", ".less"],
  },
};

1 Ответ

0 голосов
/ 04 июня 2018

Написание ответа вместо комментария, чтобы я мог опубликовать некоторый код.

Я не смог воспроизвести проблему.Следующий код работает одинаково на IE11 и Chrome для меня.

var myWeakMap = new WeakMap();

function myClass(myObject) {
    myWeakMap.set(this, myObject);
}
    
myClass.prototype.getProperty = function() {
    return myWeakMap.get(this).property;
};

var instance = new myClass({property: 5});
console.log(instance.getProperty());

Я подозреваю, что конструктор myClass как-то не определен в вашем случае.Можете ли вы проверить это?Для этого вставьте console.log в ваш конструктор и проверьте журналы для вывода:

class myClass {
    constructor(myObject) {
        console.log("myClass.constructor", myObject);
        myWeakMap.set(this, myObject);
    }
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...