Poltergeist в CircleCI: TypeError: undefined не является объектом (оценивает 'this .__ ReactionAutoBindMap') - PullRequest
0 голосов
/ 14 декабря 2018
  • Версия Webpacker: 3.5.5
  • Версия React / ReactDOM: 16.6.3
  • Версия Poltergeist: 1.10.0
  • Версия React-Rails: 1.6.2
  • React_UJS версия: 2.4.4

ПРОБЛЕМА:

Запуск моей тестовой сборки на CircleCI Я столкнулся с несколькими различными вариантами этого - Capybara::Poltergeist::JavascriptError:

Частичный просмотр моего .circleci / config.yml

 - run:
      name: precompile assets (webpacker)
      command: NODE_ENV=test bundle exec rake webpacker:compile

Все в моем браузере Chrome с использованием webpack-dev-server выглядит так, как должно.Большой пробел после имени - это просто отредактированная фамилия.

enter image description here

При запуске сборки с NODE_ENV = test я получаю эту ошибку в Circle...

Invariant Violation: Minified React error #31; visit https://reactjs.org/docs/error-decoder.html?invariant=31&args[]=object%20with%20keys%20%7B%24%24typeof%2C%20type%2C%20key%2C%20ref%2C%20props%2C%20_owner%2C%20_store%7D&args[]=

(я изучил это исключение и не понимаю его в нашем контексте)

https://reactjs.org/docs/error-decoder.html/?invariant=31&args[]=object%20with%20keys%20%7B%24%24typeof%2C%20type%2C%20key%2C%20ref%2C%20props%2C%20_owner%2C%20_store%7D&args[]=

Поскольку все идет хорошокогда я работал как dev, я решил переключить NODE_ENV в разработку, чтобы посмотреть, что из этого получилось.Следующее было ошибкой, которую я получил.

TypeError: undefined is not an object (evaluating 'this.__reactAutoBindMap')

К сожалению, есть только одна ТАК-я публикация, в которой упоминается что-то о 'this.__reactAutoBindMap', и я не нашел ничего полезного в посте.( TypeError: undefined не является объектом (оценивает 'this .__ ReactionAutoBindMap') )

Procfile

web: bundle exec rails s
webpacker: yarn start

package.json

{
  "dependencies": {
    "@babel/polyfill": "^7.0.0",
    "@rails/webpacker": "3.5",
    "babel-preset-react": "^6.24.1",
    "caniuse-lite": "^1.0.30000697",
    "jquery": "^3.3.1",
    "prop-types": "^15.6.2",
    "rails-erb-loader": "^5.5.0",
    "react": "^16.6.3",
    "react-dom": "^16.6.3",
    "react_ujs": "^2.4.4",
    "webpack": "^3.0.0"
  },
  "devDependencies": {
    "@babel/cli": "^7.2.0",
    "@babel/core": "^7.2.0",
    "webpack-dev-server": "2.11.2"
  },
  "scripts": {
    "start": "./bin/webpack-dev-server"
  }
}

.babelrc

{
  "presets": [
    [
      "env",
      {
        "modules": false,
        "targets": {
          "browsers": ["last 2 versions", "safari >= 7"],
          "uglify": true
        },
        "useBuiltIns": true
      }
    ],
    "react"
  ],
  "plugins": [
    "syntax-dynamic-import",
    "transform-object-rest-spread",
    [
      "transform-class-properties",
      {
        "spec": true
      }
    ]
  ]
}

webpacker.yml

 Note: You must restart bin/webpack-dev-server for changes to take effect

default: &default
  source_path: app/javascript
  source_entry_path: packs
  public_output_path: packs
  cache_path: tmp/cache/webpacker

  # Additional paths webpack should lookup modules
  # ['app/assets', 'engine/foo/app/assets']
  resolved_paths: ['app/javascript/react_16_components']

  # Reload manifest.json on all requests so we reload latest compiled packs
  cache_manifest: false

  extensions:
    - .jsx
    - .js
    - .js.erb
    - .sass
    - .scss
    - .css
    - .module.sass
    - .module.scss
    - .module.css
    - .png
    - .svg
    - .gif
    - .jpeg
    - .jpg

development:
  <<: *default
  compile: true

  # Reference: https://webpack.js.org/configuration/dev-server/
  dev_server:
    https: false
    host: localhost
    port: 3035
    public: localhost:3035
    hmr: false
    # Inline should be set to true if using HMR
    inline: true
    overlay: true
    compress: true
    disable_host_check: true
    use_local_ip: false
    quiet: false
    headers:
      'Access-Control-Allow-Origin': '*'
    watch_options:
      ignored: /node_modules/


test:
  <<: *default
  compile: true

  # Compile test packs to a separate directory
  public_output_path: packs-test

production:
  <<: *default

  # Production depends on precompilation of packs prior to booting for performance.
  compile: false

  # Cache manifest.json for performance
  cache_manifest: true

app / javascript / packs / application.js

/* eslint no-console:0 */
// This file is automatically compiled by Webpack, along with any other files
// present in this directory. You're encouraged to place your actual application logic in
// a relevant structure within app/javascript and only use these pack files to reference
// that code so it'll be compiled.
//
// To reference this file, add <%= javascript_pack_tag 'application' %> to the appropriate
// layout file, like app/views/layouts/application.html.erb
import "@babel/polyfill";

const react16Components = require.context('react_16_components',  true);
const ReactRailsUJS = require('react_ujs');
const $ = require('jquery');

ReactRailsUJS.useContext(react16Components);

// Generates and exposes Rails named URLs within React components!
// -- Restarting the server as you would when adding a new Rails route should expose it to the JS world, too.
require('../rails-js-routes/js-routes');

act_test.html.haml (current_user isпросто объект User)

= react_component 'admin/hello', visitor: current_user

Компоненты:

app / javascript / реаги_16_components / admin / hello.jsx

import React, { Component } from 'react'
import PropTypes from 'prop-types'
import Nav from '../navigation/nav'

export default class Hello extends Component {
  static propTypes = {
    visitor: PropTypes.object.isRequired
  };

  seeingRed() {
    $('#color-here').css('color', 'red');
  }

  render() {
    const { visitor } = this.props;

    return(
      <div style={{'textAlign': 'center'}}>
        <Nav visitor={visitor.full_name} />
        <div>Lets hope webpack gives us minimal trouble!</div>
        <button id='color-here' onClick={this.seeingRed}>Click Here!</button>
      </div>
    );
  }
}

app / javascript / реаги_16_components / navigation /nav.jsx

import React from 'react'

const Nav = ({visitor}) => (
  <div><h3>{`H! ${visitor} -- I'm a stateless component navigation bar! I swear (⌐■_■)`}</h3></div>
);

export default Nav;

app / javascript / rails-js-routs / js-rout.js.erb

<%# encoding: UTF-8 %>

<%= JsRoutes.generate() %>

app / config / webpack / loaders / erb.js

module.exports = {
  test: /\.erb$/,
  enforce: 'pre',
  exclude: /node_modules/,
  use: [{
    loader: 'rails-erb-loader',
    options: {
      runner: (/^win/.test(process.platform) ? 'ruby ' : '') + 'bin/rails runner'
    }
  }]
}

app / config / webpack / environment.js

const { environment } = require('@rails/webpacker');
const erb =  require('./loaders/erb');

environment.loaders.append('erb', erb);

module.exports = environment;

app / config / webpack / test.js

process.env.NODE_ENV = process.env.NODE_ENV || 'development'

const environment = require('./environment')

module.exports = environment.toWebpackConfig()

КОНТЕКСТ:

Мы пытаемся перенести наше большое приложение с большим количеством JS, написанных на CoffeeScript, на новую версию React.Вместо того, чтобы поднимать версию и прорабатывать предупреждения об устаревании в геме React-Rails, я пытаюсь сделать так, чтобы у нас временно работали две версии React и чтобы каждый раз, когда другой инженер прикасался к старому и устаревшему файлу CoffeeScriptони используют response-codemod и другие инструменты для преобразования кода в новый файл React 16 (и помещают его в новое дерево каталогов, которое будет использоваться, обрабатываться / транспортироваться и компилироваться Webpack вместо Sprockets).Я до сих пор не уверен, возможно ли это, но я умею хорошо управлять местным развитием, так что есть надежда (знаменитые последние слова).Я также могу рендерить старый компонент React 0.14 через = react_component(), используя имя класса camelCase поверх компонента React 16, используя тот же вспомогательный метод, но с аргументом пути вместо имени класса на той же странице, без консолиошибка.

У нас есть странные зависимости от jQuery и наших именованных маршрутов Rails, подвергающихся воздействию нашего кода React, потому что мы используем React довольно нетрадиционным способом (наследуемым).Мы добавили его в наше приложение тут и там, и не просто представили Rails API, чтобы мы могли использовать ReactRouter и Axios (или другие инструменты) для рендеринга / извлечения / манипулирования данными в более удобном для React-ишем виде.

Я обнаружил, что мое небольшое понимание и несколько «магия» конвенций Вебпакера запутывают меня.Я почти предпочел бы свернуть мою собственную конфигурацию Webpack вместо использования гема, но ради надежды я сделал довольно глупую ошибку (помимо попытки использовать две версии React), я хотел выложить это там, чтобы посмотреть, сможет ли кто-нибудьпомочь пролить свет.Супер новичок в Babel и Webpack, так что будь осторожен со мной - но ЛЮБОВЬ поможет кто-нибудь.

Заранее спасибо.

...