You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Webpack打包TypeScript代码,使其可在React Native中通过Eval执行?

Webpack打包TypeScript生成目标IIFE的配置方案

问题场景

我是Webpack新手,想打包一段TypeScript代码:

const myFunc = () => {
    return {
        a: () => {
            console.log("hello from a");
        },
        b: () => {
            console.log("hello from b");
        },
    };
};

export default myFunc;

当前用的Webpack配置:

const path = require("path");
module.exports = { 
    entry: "./test/index.ts", 
    mode: "production", 
    resolve: { 
        extensions: [".ts"], 
    }, 
    output: { 
        filename: "bundle.js", 
        path: path.resolve(__dirname, "./build"), 
    }, 
}; 

执行webpack --config webpack.config.js后得到空的bundle.js。我需要生成带压缩的IIFE,直接返回如下对象结构:

{
    a: () => { 
        console.log("hello from a")
    },
    b: () => {
        console.log("hello from b")
    }
}

方便后续在React Native里用eval调用它的a、b方法。之前试了UMD库目标,不仅报错还没得到想要的对象,该怎么改配置?


解决步骤

1. 补全TypeScript编译依赖

Webpack本身不处理TypeScript,必须安装编译工具:

npm install --save-dev typescript ts-loader

同时在项目根目录新建tsconfig.json,基础配置如下:

{
  "compilerOptions": {
    "target": "ES5",
    "module": "ESNext",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  }
}

2. 修改Webpack配置

空bundle是因为生产模式的tree shaking把没被调用的myFunc优化掉了,同时需要明确配置输出为IIFE格式,让导出内容被保留并直接返回:

修改后的webpack.config.js:

const path = require("path");
module.exports = { 
    entry: "./test/index.ts", 
    mode: "production", 
    resolve: { 
        extensions: [".ts", ".js"], 
    },
    // 添加TS编译规则
    module: {
        rules: [
            {
                test: /\.ts$/,
                use: "ts-loader",
                exclude: /node_modules/
            }
        ]
    },
    output: { 
        filename: "bundle.js", 
        path: path.resolve(__dirname, "./build"),
        // 指定输出为IIFE格式
        library: {
            type: "iife"
        },
        // 导出默认导出项
        libraryExport: "default",
        // 确保IIFE在全局环境正常执行
        globalObject: "this"
    },
    optimization: {
        // 关闭usedExports避免tree shaking移除未被调用的导出
        usedExports: false
    }
}; 

3. 可选:调整TS代码简化输出

如果希望IIFE直接返回目标对象,不用额外调用函数,可以直接修改TS代码:

export default {
    a: () => {
        console.log("hello from a");
    },
    b: () => {
        console.log("hello from b");
    },
};

这样打包后的IIFE会直接返回你需要的对象,eval后就能直接调用a()或b()。

关于UMD的问题

UMD格式需要指定全局变量名(比如library: {name: "MyLib", type: "umd"}),没指定的话会报错。但你的需求是用eval调用,IIFE更合适——它会直接返回值,eval执行后就能拿到目标对象,不需要挂载全局变量。


内容的提问来源于stack exchange,提问作者Lee Hodges

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:57:06