Webpack ES6-通过动态导入加载Json(保留json文件)

Lea*_*res 5 javascript ecmascript-6 reactjs webpack webpack-file-loader

我正在尝试将json文件(2个文件)拆分为多个单独的块。我能够做到,但是有一个“骗局”。

这些json .js通过webpack 转换为,这就是为什么我file-loader.json文件中添加了,但await import现在返回的是字符串而不是json。

Webpack规则

module: {
    rules: [
        { test: /\.scss$/, use: [MiniCssExtractPlugin.loader, "css-loader", "postcss-loader", "sass-loader",] },
        { test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&mimetype=application/font-woff&name=fonts/[name].[ext]" },
        { test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&mimetype=application/font-woff2&name=fonts/[name].[ext]" },
        { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&mimetype=application/octet-stream&name=fonts/[name].[ext]" },
        { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&mimetype=application/vnd.ms-fontobject&name=fonts/[name].[ext]" },
        { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&mimetype=image/svg+xml&name=fonts/[name].[ext]" },
        {
            test: /\.(js|jsx)$/,
            // Skip any files outside of project's `src` directory
            include: [
                path.resolve(__dirname, "../src"),
            ],
            loaders: ["babel-loader"],
        },
        {
            test: /\.json$/,
            type: "javascript/auto",
            loader: "file-loader",
            options: { name: "i18/[name].[ext]" },
            include: [
                path.resolve(__dirname, "../src"),
            ],
        },
        { test: /\.(jpg|png)$/, loader: "url-loader" }
    ]
}
Run Code Online (Sandbox Code Playgroud)

注意test: /\.json$/规则。

在这里我说的是,我希望它被加载file-loader而不是默认的webpack捆绑js。

注意:如果没有此规则,则该应用程序可以正常运行,但是我需要这些.json文件

这是最终结果:

S1

两个json都可以。问题在于i18n.0<...>i18n.1分别代表en-USpt-PT

现在...我正在使用动态导入(不进行转译)调用这些文件:

/* This loading must be async, it will load the file from the server on-demand */

export const getLanguageFile = async (lang = "en-US") 
   => await import(/* webpackChunkName: "i18n." */ `../i18n/${lang}.json`);
Run Code Online (Sandbox Code Playgroud)

然后将其称为:

async componentDidMount() {
    /* Get user info (properties) */
    var properties = await fetch.get("/account/GetUserProperties");

    /* Get language file based in the language code provided in the properties */
    var file = await getLanguageFile(properties.data.LanguageCode);
    this.props.setUserProperties(properties.data, file);
}
Run Code Online (Sandbox Code Playgroud)

最后一个变量file分配有:

S2

此变量应在文件中包含完整的json。

我知道为什么会这样,这是因为它将调用i18n.0<...>而不是.json,并且该文件具有以下内容:

(window.webpackJsonp = window.webpackJsonp || [])
    .push(
        [[2], {
            "./src/translations/i18n/en-US.json": function (n, o, s) {
                n.exports = s.p + "i18/en-US.json"
            }
        }]
    );
Run Code Online (Sandbox Code Playgroud)

我该如何使用动态导入来调用那些json,但保留完整的json文件?

我需要json,因为它可能会在服务器端进行编辑。

Lea*_*res 4

好吧,我是怎么解决这个问题的?

我没有使用,而是import()向文件发出了 xhr 请求。

但有一个问题,我仍然需要将文件放在dist文件夹中。

为此,我使用了copy-webpack-plugin,这样您就可以在捆绑过程中将文件和文件夹转储到任何位置。

我删除了 json 规则,并添加了如下插件:

new CopyWebpackPlugin([{ from: "src/translations/i18n", to: "i18n" }]),
Run Code Online (Sandbox Code Playgroud)

好的,它将i18n文件夹转储到dist

在此输入图像描述

之后,我将我的功能更改getLanguageFile为:

export const getLanguageFile = async (lang = "en-US") 
   => (await axios.get(`/i18n/${lang}.json`)).data;
Run Code Online (Sandbox Code Playgroud)

这会将文件作为 json 返回,并且一切正常。

笔记

开发构建:webpack-dev-server(服务器)+ ASP.Net Core(API)

生产构建:ASP.Net Core(服务器和 API)