【问题标题】:Preact You may need an appropriate loader to handle this file typePreact 你可能需要一个合适的加载器来处理这个文件类型
【发布时间】:2018-02-03 01:05:41
【问题描述】:

只是需要一些帮助,我在这场斗争中失去了理智。我已经搜索了很多类似问题的帖子,但没有成功,这就是我在这里寻求帮助的原因。

我目前在 webpack-dev-server 上运行简单的 React,当我想建立 preact 兼容时,我得到了这个错误:

您可能需要适当的加载程序来处理 Client.jsx 上的这种文件类型

这是文件:

Client.jsx

import React from 'react';
import { render } from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import App from './App';

const renderClient = () => {
  render(
    <BrowserRouter>
      <App />
    </BrowserRouter>,
    document.getElementById('app'),
  );
};

renderClient();

webpack.config.js

const path = require('path');
const webpack = require('webpack');

const config = {
  context: __dirname,
  entry: './src/components/Client.jsx',
  devtool: 'cheap-module-eval-source-map',
  output: {
    path: path.join(__dirname, 'public'),
    filename: 'bundle.js',
    publicPath: '/public/',
  },
  resolve: {
    extensions: ['.js', '.jsx', '.json'],
    alias: {
      react: 'preact-compat',
      'react-dom': 'preact-compat',
    },
  },
  devServer: {
    publicPath: '/public/',
    historyApiFallback: true,
  },
  stats: {
    colors: true,
    reasons: true,
    chunks: false,
  },
  plugins: [new webpack.NamedModulesPlugin()],
  module: {
    rules: [
      {
        enforce: 'pre',
        test: /\.js$/,
        loader: 'eslint-loader',
        exclude: /node_modules/,
      },
      {
        test: /\.jsx?$/,
        loader: 'babel-loader',
        include: [path.resolve('js'), path.resolve('node_modules/preact-compat/src')],
      },
    ],
  },
};

if (process.env.NODE_ENV === 'production') {
  config.devtool = 'source-map';
  config.plugins = [];
}

module.exports = config;

.babelrc

{
  "plugins": [
    ["transform-react-jsx", { "pragma": "h" }],
    [
      "module-resolver",
      {
        "root": ["."],
        "alias": {
          "react": "preact-compat",
          "react-dom": "preact-compat"
        }
      }
    ]
  ],
  "presets": [
    "react",
    [
      "env",
      {
        "targets": {
          "browsers": "last 2 versions"
        },
        "loose": true,
        "modules": false
      }
    ]
  ],
  "env": {
    "test": {
      "plugins": ["babel-plugin-transform-es2015-modules-commonjs"]
    }
  }
}

【问题讨论】:

    标签: reactjs webpack babeljs webpack-dev-server preact


    【解决方案1】:

    在您的.jsx 规则中,您只包含目录./js/./node_modules/preact-compat/src/ 中的文件,但您的条目是./src/components/Client.jsx,因此Babel 不适用于它。您还需要将./src/ 文件添加到规则中。

    path.resolve('js') 可能应该是 path.resolve('src'),除非您的代码中使用了 ./js/ 目录。此外,preact-compat/src 是不必要的,因为它提供了一个已经转译的代码,将在您导入 preact-compat 时使用。

    {
      test: /\.jsx?$/,
      loader: 'babel-loader',
      include: [path.resolve('src')],
    },
    

    您可以排除您不想想要转译的所有内容,而不是只包括您需要转译的内容。这通常是 node_modules,就像您在 ESLint 规则中所做的那样。

    {
      test: /\.jsx?$/,
      loader: 'babel-loader',
      exclude: /node_modules/,
    },
    

    【讨论】:

    • 非常感谢兄弟!
    【解决方案2】:

    您错过了一个将操纵jsx 的加载程序。 如果你正在使用 Babel,你可以使用 babel-loader 将 jsx 转换为 js。

    您可以将该加载程序添加到您的 webpack.config.js 文件中

    var config = {
        // Existing Code ....
        module : {
            loaders : [
                {
                    test : /\.jsx?/,
                    include : APP_DIR,
                    loader : 'babel'
                }
            ]
        }
    }
    

    【讨论】:

    • 我已将此标记为不是答案。引用链接的问题在于,当/如果他们死了,这对未来的读者来说毫无用处。我建议从该链接复制相关详细信息并引用它,因此至少如果它消失了,问题仍然存在。
    • 对不起,它不起作用,它仍然说同样的错误
    猜你喜欢
    • 2021-12-07
    • 2016-09-28
    • 2016-07-13
    • 2019-08-15
    • 2017-03-22
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    相关资源
    最近更新 更多