【问题标题】:'Cannot find module' when using webpack loaders使用 webpack 加载器时“找不到模块”
【发布时间】:2018-01-03 01:20:51
【问题描述】:

我使用 Next.js 为我的应用程序使用自定义 webpack:

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

module.exports = {
  webpack: (config, { dev }) => {
    config.plugins.push(
      new Webpack.DefinePlugin([{
          __BROWSER__: "typeof window !== 'undefined'",
          __NETLIFY_BRANCH__: JSON.stringify(process.env.BRANCH),
          __CONFIG__: JSON.stringify({
            GRAPHQL_URL: process.env.GRAPHQL_URL,
            SEGMENT_WRITEKEY: process.env.SEGMENT_WRITEKEY,
          }),
        }])
      )
      config.module.rules.push(
        {
          test: /\.png$/,
          use: {
          loader: 'url-loader',
           options: {
             limit: 10000,
             name: 'graphics/[name].[ext]',
           },
         },
       },
       {
      test: /\.svg$/,
      loader: [
        {
          loader: 'babel-loader',
          query: {
            presets: ['es2015']
          }
        },
        {
          loader: 'svg-react-loader',
        },
        {
          loader: 'string-replace-loader',
          options: {
            search: ' xmlns="http://www.w3.org/2000/svg"',
            replace: '',
                    },
                  },
                ],
              },
            );
      return config;
  },
};

但是当我尝试将图像添加到我的组件时,我的 localhost 启动了,但我收到了错误:

Cannot find module '../assets/logo.svg'

我像往常一样将我的图像导入组件,没有图像,我的应用程序正在运行。也许我应该在我的 webpack 中添加一些东西? dir assets 中设置的所有图像。

import logo from '../assets/logo.svg'; 

export default class Layout extends React.Component {
render () {
    return (
    <img src={logo} alt="logo" />
  )
 }
}

【问题讨论】:

  • 您确定 SVG 文件的路径正确(相对于您的组件文件)? (fwiw,您的组件文件有错字,defailt 而不是default
  • 抱歉,打错字了。是的,路径是正确的。
  • 查看我的更新答案。
  • @robertklep 你需要我的项目结构吗?
  • 不,不需要结构,与那个无关:)

标签: javascript reactjs module webpack loader


【解决方案1】:

问题(据我了解:https://github.com/zeit/next.js/issues/544)是 Next.js 不使用 Webpack 进行服务器端渲染,仅用于客户端,因此您不能像导入 SVG 时那样导入纯粹是一个客户端 React 项目(即通过为 .svg 文件添加规则并通过加载器链运行这些文件)。

here 提到了一个可能的解决方案,其中 SVG 导入不是由 Webpack 加载器完成,而是由 Babel( 在 Next.js 的服务器端代码中使用)完成。

它似乎对我有用,就像这样:

  • npm i babel-plugin-inline-react-svg --save
  • 将以下内容添加/合并到您的 Babel 配置中(有关如何设置自定义 Babel 配置here 的更多信息):

     "plugins": [
       "inline-react-svg"
     ]
    
  • 在您的组件/页面中,使用它(变量名称LogoSVG 很重要,不应更改):

    import LogoSVG from '../assets/logo.svg';
    
  • 并将其用作 React 组件:

    return <LogoSVG alt="logo" />
    

【讨论】:

  • 谢谢,我编辑了这部分,但是关于模块的错误仍然存​​在:(
  • 如果我将在组件中使用大量图像怎么办?我不能都像 React 组件。
  • @ValeriaShpiner 在这种情况下,您可能应该考虑将这些图像设为静态资源 (github.com/zeit/next.js#static-file-serving-eg-images)
  • 另一件事。我用于我的项目 Glamour 并为此设置了文件 _document.js。当我向 Babel 添加额外的插件时,控制台显示错误 Unexpected token: return { ...page, ...styles } ... 不适合它。也许你知道我怎样才能避免它?
  • Babel 配置中定义了哪些预设?它应该(至少)包含next/babel
猜你喜欢
  • 2021-04-15
  • 2017-04-15
  • 1970-01-01
  • 2021-03-16
  • 2016-07-19
  • 2017-01-08
  • 1970-01-01
相关资源
最近更新 更多