【问题标题】:Webpack ES6- Load Json with dynamic import (Preserve json file)Webpack ES6- 使用动态导入加载 Json(保留 json 文件)
【发布时间】:2018-11-14 02:45:28
【问题描述】:

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

那些 json 被 webpack 转换为 .js,这就是为什么我在 .json 文件中添加了一个 file-loader,但是 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" }
    ]
}

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

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

注意:没有这个规则,应用可以正常工作,但我需要那些 .json 的

这是最终结果:

两个 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`);

然后在这里调用:

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);
}

最后一个变量file 赋值为:

此变量应具有文件中的完整 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"
            }
        }]
    );

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

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

【问题讨论】:

    标签: javascript reactjs webpack ecmascript-6 webpack-file-loader


    【解决方案1】:

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

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

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

    为此,我使用了copy-webpack-plugin,通过它您可以在捆绑过程中将文件和文件夹转储到任何地方。

    我删除了我的 json 规则,并添加了这样的插件:

    new CopyWebpackPlugin([{ from: "src/translations/i18n", to: "i18n" }]),
    

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

    在此之后,我将函数getLanguageFile 更改为:

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

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

    注意

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

    生产版本:ASP.Net Core(服务器和 API)

    【讨论】:

    • 使用CopyWebpackPlugin,您可以操纵哈希来绕过to: 'to/[name].[hash].[ext]'等问题
    • 你知道如何在用法中引用散列,例如在 fetch 中?
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 2020-04-25
    • 2017-11-04
    • 2017-09-29
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多