使用 Webpack 文件加载器导入静态 json 文件给出文件路径而不是 json 内容

Posted

技术标签:

【中文标题】使用 Webpack 文件加载器导入静态 json 文件给出文件路径而不是 json 内容【英文标题】:Using Webpack file-loader to import static json file gives file path instead of json contents 【发布时间】:2020-04-25 07:03:36 【问题描述】:

我正在尝试使用 Webpack 文件加载器将静态 json 资源文件复制到 dist/,以便我可以将该 json 文件导入 Vue.js 组件中。当我运行npm run build 时,Webpack 正在正确复制文件,但是当我尝试导入文件(如import myJson from '@/static/runtimeConfig.json')时,“myJSON”变量只获取文件路径而不是实际的 JSON 文件内容。谁能帮我理解这是为什么?

我的 webpack 文件加载器配置如下所示:

module: 
      //load runtimeConfig.json file through a custom loader
      rules: [
        
          // set the type to javascript/auto to bypass webpack's built-in json importing
          type: 'javascript/auto',
          test: /(runtimeConfig\.json)$/i,
          // file-loader resolves imports on a file and emits that file to dist/
          loader: 'file-loader',
          // use filename runtimeConfig.json instead of a hashed filename
          options: 
            name: '[path][name].[ext]',
            outputPath: 'static',
          
        
      ],
    ,

我的意图是在 vue.js 组件中导入一个 json 文件,如下所示:

import myJson from '@/static/runtimeConfig.json'

但是,在我进行导入之后,myJson 只是文件的路径,而不是实际的 json 内容

console.log(myJson)
--> /static/src/static/runtimeConfig.json

【问题讨论】:

【参考方案1】:

这正是file-loader 所做的——它将文件复制到dist 并返回文件的路径。因为它主要用于处理imghref属性的内容。现在您可以使用提供的路径通过 ajax 请求在运行时将其加载到正在运行的应用程序中...

如果您只想将 JSON 文件作为对象包含到您的应用程序中,您可以直接导入它而无需任何 Webpack 配置,它将作为 JS 对象导入并包含在您的 JS 包中。这发生在构建时

【讨论】:

感谢您的回复。我希望进行导入而不是 HTTP GET,但我认为我必须进行 HTTP GET。导入方法似乎只在构建时起作用。由于我将在运行时更改 JSON 文件,因此我不希望它在构建期间被编译。 是的,导入是构建时间的事情。因此,您必须为每个不同的runtimeConfig.json 进行多次构建。但是在运行时通过 Ajax 调用加载文件会减慢您的应用程序速度(等待请求)。这是你的选择......

以上是关于使用 Webpack 文件加载器导入静态 json 文件给出文件路径而不是 json 内容的主要内容,如果未能解决你的问题,请参考以下文章

使用 react webpack 文件加载器提供静态 pdf

Sass - 为从文件导入的所有类添加前缀(使用 sass 导入或 webpack 加载器)

直接在应用程序(webpack)的入口点导入文件加载器。感叹号是啥?

Webpack 样式加载器未将样式注入 DOM

是否可以在 TypeScript 导入中指定 webpack 加载器?

使用 React、Typescript 和 Webpack 显示静态图像