Ошибка типа: не удается вызвать класс как функцию после развертывания в Netlify?

#javascript #reactjs #tensorflow #netlify

#javascript #reactjs #tensorflow #netlify

Вопрос:

Здравствуйте, я пытаюсь развернуть веб-приложение в Netlify. Он использует модель COCO SSD для распознавания объектов во внешнем интерфейсе, что является целенаправленным. Веб-приложение отлично работает на localhost, но после развертывания в Netlify я получаю эту ошибку:

 detector.js:47 TypeError: Cannot call a class as a function
    at r (classCallCheck.js:3)
    at new t (tensor.ts:266)
    at t.value (engine.ts:736)
    at i (tensor_ops_util.ts:75)
    at i (tensor.ts:55)
    at Module.p (io_utils.ts:223)
    at t.value (graph_model.ts:139)
    at t.<anonymous> (graph_model.ts:119)
    at c (runtime.js:63)
    at Generator._invoke (runtime.js:293)
  

У меня никогда раньше не было этой проблемы, и я нахожу это очень странным, это мой код для реализации модели COCO SSD и класса.

 import React from 'react';
import Lottie from 'react-lottie';
import * as cocoSsd from '@tensorflow-models/coco-ssd';
import '@tensorflow/tfjs';

class Detector extends Component {
  constructor(props) {
    super(props);

    this.state = {
      count: 0,
      list: ['person','laptop','scissors','mouse', 'spoon', 'keyboard',],
      isStopped: true,
    }
  } 
  videoRef = React.createRef();

  componentDidMount() {
    if (navigator.mediaDevices amp;amp; navigator.mediaDevices.getUserMedia) {
      //getting camera permission code removed for readability
      const modelPromise = cocoSsd.load();
      Promise.all([modelPromise, webCamPromise])
        .then(values => {
          this.detectFrame(this.videoRef.current, values[0]);
        })
        .catch(error => {
          console.error(error);
        });
    }
  }

  detectFrame = (video, model) => {
    model.detect(video).then(predictions => {
      this.checkPredictions(predictions);
      requestAnimationFrame(() => {
        this.detectFrame(video, model);
      });
    });
  };

  checkPredictions = predictions => {
    predictions.forEach(prediction => {
      if(prediction.class === this.state.list[0]) {
        const tempL = this.state.list;
        const tempC = this.state.count   1;
        tempL.shift();
        this.setState({list: tempL, count: tempC, isStopped: false});
      }
    });
  };

  render() {
    return (
      <div>
        //removed for readability
      </div>
    );
  }
}

export default Detector;
  

Комментарии:

1. Как вы создаете свой код? Ранее, я помню, была та же проблема, что и при сборке кода со стилем target with es5

2. 🙂 Я имел в виду, используете ли вы babel и webpack и как вы их настроили?

3. Хммм. При использовании react-scripts это было бы сложно изменить, поскольку оно само упаковывается и настраивается, если вы не используете react-script-wired , который позволяет настраивать конфигурацию. Доступно ли ваше хранилище?

4. Я пытался запустить ваш репозиторий, но он работает нормально. Какую версию узла вы используете?

5. Я думаю, я знаю, в чем проблема. Я оставил для вас предложение

Ответ №1:

Похоже, что webpack выбрано поле (встроенный файл) @tensorflow/tfjs в случае производственного режима, что приводит к возникновению проблемы.

Но мы можем указать это поле вручную, которое описывается здесьhttps://webpack.js.org/configuration/resolve/#resolvemainfields

Чтобы сделать это, вы просто переключаетесь на use, react-app-rewired где мы можем настроить webpack конфигурацию. Вот шаги:

  • Установить
 npm i -D react-app-rewired
  
  • Создайте файл конфигурации переопределения в корневом репозитории config-overrides.js со следующим содержимым:
 module.exports = function override(config, env) {
  if (process.env.NODE_ENV === 'production')
  {
    config.resolve.mainFields = ['main'];
  }
  return config;
}
  
  • Переключитесь на использование react-app-rewired скрипта, заменив react-scripts команды:
 "scripts": {
  "start": "react-app-rewired start",
  "build": "react-app-rewired build",
  // ...  
},
  

Наконец, вы можете запустить npm build и предоставить свой встроенный контент для его тестирования. Вот и все!

Комментарии:

1. Это работает! Большое вам спасибо за вашу помощь на всем этом пути, я буквально не могу отблагодарить вас. Если это чего-то стоит, я открыл награду, и вы будете награждены 100 очками через 24 часа. Спасибо, что сделали мой день лучше 🙂