Webpack - Typescript - Babel Loader 不转译 JSON 导入

Webpack - Typescript - Babel Loader not transpiling JSON import

为我的本地设置设置一个新的 webpack 构建以在整个系统中使用。又名将我的 webpack 设置构建为私有节点包,因为我所有的工作实际上是相同的,因此将其构建为全局包。类似于laravel mix.

的概念

无论如何,我已经获得了正确转译 Typescript 的 webpack 设置,在浏览器中调用时一切看起来都不错并且按预期工作。但是,当我使用 import * as json from 'somewhere-over-the-rainbow.json;

.json 文件导入 TS 文件时,我 运行 遇到了问题

转译代码

(()=>{var e={27:e=>{e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},963:e=>{function t(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}e.exports=function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}},536:e=>{e.exports=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}}},t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);n.r(r);var o={};if(2&t&&"object"==typeof e&&e)for(const t in e)o[t]=()=>e[t];return o.default=()=>e,n.d(r,o),r},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{"use strict";var e=n(27),t=n.n(e),r=n(963),o=n.n(r),i=n(536),a=n.n(i);const u=["Example"];var l=n.t(u,2);(function(){function e(){t()(this,e),a()(this,"components",void 0),this.components=l}return o()(e,[{key:"init",value:function(){this.attachComponents()}},{key:"attachComponents",value:function(){}}],[{key:"build",value:function(){console.log("TEST"),(new e).init()}}]),e})().build()})()})();

如您所见,这导致 2 个“行”为 for(const t in e)o[t]=()=>e[t];const u=["Example"];

如果我删除 .json 导入,代码会按预期转译

(()=>{var e={27:e=>{e.exports=function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}},963:e=>{function n(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}e.exports=function(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),e}}},n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{}};return e[r](o,o.exports,t),o.exports}t.n=e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return t.d(n,{a:n}),n},t.d=(e,n)=>{for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},t.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),(()=>{"use strict";var e=t(27),n=t.n(e),r=t(963),o=t.n(r);(function(){function e(){n()(this,e)}return o()(e,[{key:"init",value:function(){this.attachComponents()}},{key:"attachComponents",value:function(){}}],[{key:"build",value:function(){console.log("TEST"),(new e).init()}}]),e})().build()})()})();

我已经无休止地调整了 Babel Preset 选项,唯一似乎可以转换我的测试代码 without const 的选项是将 module 设置为commonjs 感觉不可靠,所以已恢复(最好知道这是否合适)。

有没有人对此有任何见解?我的看法是 Babel Loader 实际上在做它的工作,但是 JSON 在 Babel 转译 TS > ES 之后被“加载”,这导致了 ES6 代码出现在 ES5 代码中的问题。

下面的Webpack规则和TS配置

            module: {
                rules: [
                    {
                        test: /\.tsx?$/,
                        use: {
                            loader: 'babel-loader',
                            options: {
                                plugins: [
                                    '@babel/plugin-proposal-class-properties',
                                    '@babel/plugin-proposal-object-rest-spread',
                                    '@babel/plugin-transform-runtime'
                                ],
                                presets: [
                                    '@babel/react', 
                                    '@babel/preset-typescript',
                                    [
                                        '@babel/preset-env',
                                        {
                                            targets: [
                                                '>0.25%'
                                            ]
                                        }
                                    ]
                                ]
                            }
                        },
                        exclude: /node_modules/
                    },
                    {
                        test: /\.s[ac]ss/i,
                        use: [
                            miniCssExtract.loader,
                            'css-loader',
                            'sass-loader'
                        ]
                    }
                ]
            }

tsconfig.json

{
    "compilerOptions": {
        "allowJs": true,
        "baseUrl": "./src",
        "forceConsistentCasingInFileNames": true,
        "importHelpers": true,
        "jsx": "react",
        "module": "esnext",
        "moduleResolution": "node",
        "noImplicitAny": true,
        "removeComments": true,
        "resolveJsonModule": true,
        "outDir": "dist",
        "strict": true,
        "target": "es5"
    }
  }

注意:我已经通过 Babel 的在线转译器(使用 es2015 预设)处理了上面 Transpiled Code 的输出并且输出符合预期,也就是所有 const 更改为 var.

感谢您的帮助:)

你可以试试这个:

const json = require('path-to-file.json');