Preact с styled-компонентами вызывает ошибку в консоли браузера - PullRequest
0 голосов
/ 16 января 2019

Простой импорт стилевых компонентов приводит к этой ошибке в консоли браузера:

styled-components.browser.esm.js?face:1670 Uncaught TypeError: (0 , _react.createContext) is not a function
    at Object.eval (styled-components.browser.esm.js?face:1670)
    at eval (styled-components.browser.esm.js:2490)
    at Object../node_modules/styled-components/dist/styled-components.browser.esm.js (vendors~index.js:167)
    at __webpack_require__ (index.js:79)
    at eval (index.js?12d5:2)
    at Object../src/index.js (index.js:165)
    at __webpack_require__ (index.js:79)
    at checkDeferredModules (index.js:46)
    at index.js:152
    at index.js:155

Я использую webpack, preact, Babel.

Код для воспроизведения - буквально просто в новой пустой сборке:

SRC / index.js:

import { h, Component, render } from "preact"
import styled from "styled-components"

package.json:

{
  "name": "App",
  "version": "0.0.1",
  "description": "Web app.",
  "main": "index.js",
  "scripts": {
    "build": "rm -rf dist/* && NODE_ENV=development webpack -d --config webpack.conf.js --env development"
  },
  "devDependencies": {
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.5",
    "babel-plugin-transform-react-jsx": "^6.24.1",
    "babel-preset-env": "^1.7.0",
    "babel-preset-react": "^6.24.1",
    "html-webpack-plugin": "^3.2.0",
    "preact": "^8.4.2",
    "preact-compat": "^3.18.4",
    "styled-components": "^4.1.3",
    "webpack": "^4.28.4",
    "webpack-cli": "^3.2.1"
  },
  "dependencies": {}
}

webpack.conf.js:

const path = require("path")
const webpack = require("webpack")
const htmlWebpackPlugin = require("html-webpack-plugin")

module.exports = {
  entry: {
    index: "./src/index.js"
  },
  module: {
    rules: [{
      test: /\.(js|jsx)$/i,
      use: {
        loader: 'babel-loader',
        options: {
          presets: [
            'babel-preset-env',
            'babel-preset-react'
          ],
          plugins: [
            [ 'babel-plugin-transform-react-jsx', {
              pragma: 'h'
            }],
          ]
        }
      }
    }]
  },
  output: {
    publicPath: ("http://your-hostname.com/"),
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js',
    chunkFilename: '[name].js'
  },
  optimization: {
    splitChunks: {
      chunks: 'all'
    },
    occurrenceOrder: true
  },
  plugins: [
    new htmlWebpackPlugin({
      template: './public/index.html',
      filename: 'index.html'
})
  ],
  resolve: {
    alias: {
      'react': 'preact-compat',
      'react-dom': 'preact-compat'
    }
  }
}

Сборка с использованием npm run build работает нормально, но посещение получившейся страницы в браузере приводит к вышеуказанной ошибке.

Любые указатели будут приняты с благодарностью.

Edit:

Согласно эта проблема зарегистрирована в Preact-CLI , у preact нет реакции contextApi, поэтому я должен понизить styled-components до v3 вместо v4. Понижение рейтинга действительно решает проблему.

Смущает, однако, Джейсон Миллер, автор преакта, говорит в твите , что «преакт прекрасно поддерживает контекст». Я, наверное, неправильно понимаю это.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Отказ от ответственности: я работаю над preact.

Вы видите эту ошибку, потому что createContext -API не поддерживается в Preact 8.x. Это будет частью нашего следующего основного релиза, который уже не за горами. В настоящее время мы находимся в бета-версии и надеемся вскоре перейти к кандидату на релиз.

Если вам абсолютно необходимо styled-components для работы с Preact 8.x, тогда ваш единственный вариант - понизить до styled-components V3, как предложил @ukosteopath.

0 голосов
/ 16 января 2019

См. Здесь https://github.com/developit/preact-cli/issues/672#issuecomment-440985092 и мои правки выше.

Понижение styled-components с v4 до v3 "исправляет" проблему.

...