javascript - 使用 Webpack 通过 JSON 文件配置 Angular

标签 javascript json angular typescript webpack

我的 Angular 应用程序配置有 JSON 文件。我通过 HTTP GET 加载它,但最近决定通过使用定义文件向 TypeScript 添加 JSON 支持来直接包含它:

declare module "*.json" {
    const value: any;
    export default value;
}

然后在需要的地方导入它:

import * as config from '../config.json';

这很好用; config 是 JSON 对象本身。

问题是我正在与 Webpack 捆绑,我希望 JSON 文件位于包中,但不与其他任何东西捆绑,即 config.json 应该是它自己的文件放在包中,而不是与其他文件捆绑在一起。

我尝试使用 file-loader 执行此操作和 move-file-loader :

module: {                                                                    
    rules: [  
    // ...  
    {                                                                        
       test: /\.json$/,                                                       
       loader: 'file-loader?name=[name].json'                                 
    }                                                      
    // OR                                                                    
    {                                                                
        test: /\.json$/,                                                     
        loader: "move-file-loader?name=[name].json!json-loader"              
    }
    // ...
    ]
}

这可以防止 JSON 文件被捆绑并将其放置在包中我想要的位置,但它也使 config 成为 JSON 文件的相对路径,即 ”。/config.json",而不是 JSON 对象本身。

对于为什么会这样有什么想法吗?

最佳答案

显然文件加载器发出文件加载位置的路径,而不是文件内容本身。所以

import * as config from '../config.json';

config 制作为包含文件路径的字符串是正确的行为。

就 move-file-loader 而言,由于我将其与 json-loader 一起使用,因此“移动”文件的内容实际上是 TypeScript 模块定义,并且它似乎仍在加载捆绑版本文件的版本而不是“复制”的版本。

这些见解引导我得出以下解决方案:首先,我们将使用 Webpack 配置中的文件加载器复制 JSON 文件:

module: {                                                                    
    rules: [  
    // ...  
    {                                                                        
       test: /\.json$/,                                                       
       loader: 'file-loader?name=[name].json'                                 
    }
    // ...
    ]
}

然后我们将使用 TypeScript 的 require 语法导入文件加载器发出的文件路径

const configFile = require('../config.json');

此导入方法不需要我在问题中提到的 JSON 定义文件。

最后,我们可以通过 HTTP GET 从文件加载器路径加载文件:

http.get(configFile).map(res => res.json()).catch((error: any): any => {
    // ...
}).subscribe(config => {
    // ...
});

其中 config 是 JSON 文件的解析内容。

我不会立即将此标记为答案,以防有人知道如何在没有 HTTP 的情况下使其工作。

关于javascript - 使用 Webpack 通过 JSON 文件配置 Angular,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47723849/

相关文章:

javascript - 避免无限循环

c# - 从 JSON 字符串中获取特定值

node.js - 如何在 Ionic 2 中为在本地主机中运行的 Node 服务器发送发布请求?

arrays - 带有 *ngFor 的 Angular2 奇怪的形式行为

javascript - 不断更新两个 slider 的值

javascript - Coffeescript 需要带参数的模块,browserify

javascript - 如何附加其中包含其他嵌套元素的 div?

json - Grails 3 JSON 渲染无法渲染列表?

javascript - 如何在react js初始化时将一个状态值传递给另一个状态

html - 如何禁用 Angular 匹配