V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liuidetmks
V2EX  ›  程序员

为什么 Typescript 不添加条件编译这个功能?

  •  
  •   liuidetmks · 2021-12-13 11:11:35 +08:00 · 2806 次点击
    这是一个创建于 1079 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为什么 ts 不添加条件编译这个功能?
    似乎有人提过这个,但是被很多前端否了,也就无了 是的,有时候用 minify 能做到把测试代码去掉,但是这样似乎也仅限于简单的同步代码。

    我的使用的 gulp,流程是 ts -> js -> terser -> min.js

    /// 下面这个 minify 能满足预期, 最终生成代码不包含测试代码 log
    if(__DEBUG_FLAG__ == 1){
        log('some log ');
        prepareTestDataSync();
        
    }
    
    
    ///下面代码,虽然也能做到 prepareTestDataAsync, 但是代码还是在最终生成 min.js 文件里面.
    if(__DEBUG_FLAG__ == 1){
        await prepareTestDataAsync();
    }
    
    
    第 1 条附言  ·  2021-12-13 12:16:56 +08:00

    没有写清楚,目标代码是ES5, 没有原生await,导致teser不能正常工作。

    teser 能删掉 第一个 prepareTestDataAsync_step1 并不能删掉 prepareTestDataAsync_step2

    另外,我想 prepareTestDataAsync_stepXXXX 方法体也不要在目标代码中.

    这是目前的代码
    class A{
     async prepareTestDataAsync_step1{};
     async prepareTestDataAsync_step2{};
    
     async func1(){
        if(__DEBUG__){
           await prepareTestDataAsync_step1();
           await prepareTestDataAsync_step2();
      }
    }
    
    // 我想要的
    
    class A{
    #if __DEBUG__
     async prepareTestDataAsync_step1{};
     async prepareTestDataAsync_step2{};
    #endif
    ...
    
     async func1(){
    #if  __DEBUG__
           await prepareTestDataAsync_step1();
           await prepareTestDataAsync_step2();
    #endif
      }
    }
     
    
    
    16 条回复    2021-12-13 23:26:36 +08:00
    kaixuan1901
        1
    kaixuan1901  
       2021-12-13 11:13:03 +08:00
    我也想知道,之前就想要这个功能。
    mxT52CRuqR6o5
        2
    mxT52CRuqR6o5  
       2021-12-13 11:17:36 +08:00
    我这边找了个在线的 terser 测试,能把 async function 中条件为 false 的 if 分支去掉
    learningman
        3
    learningman  
       2021-12-13 11:20:52 +08:00
    你可以自己写个预处理的 loader ,webpack 是可以的,gulp 大概也可以吧
    learningman
        4
    learningman  
       2021-12-13 11:22:24 +08:00
    而且也不应该这样吧,测试的代码不应该放在主代码里,应该是测试起来之前那个 before/prepare/build 里面准备这些 mock 的东西
    liandi1990
        5
    liandi1990  
       2021-12-13 11:27:43 +08:00 via iPhone
    typescript 的类型系统和 c++ 一样是图灵完备的

    或许可以实现一个类似 sfinae 或者 constexpr if 的东西?
    liuidetmks
        6
    liuidetmks  
    OP
       2021-12-13 11:41:25 +08:00
    @mxT52CRuqR6o5 编译到 ES5 代码里面只能去掉第一个 调用,
    prepareTestDataAsync_step0();
    prepareTestDataAsync_step1();
    prepareTestDataAsync_step2();

    step1 step2 会保留
    ,我希望 prepareTestDataAsync 方法体也不要编译到 minijs 里面
    luob
        7
    luob  
       2021-12-13 11:42:16 +08:00   ❤️ 2
    https://rollupjs.org/repl/?version=2.61.1&shareable=JTdCJTIybW9kdWxlcyUyMiUzQSU1QiU3QiUyMm5hbWUlMjIlM0ElMjJtYWluLmpzJTIyJTJDJTIyY29kZSUyMiUzQSUyMiUyRiolMjBEWU5BTUlDJTIwSU1QT1JUUyU1Q24lMjAlMjAlMjBSb2xsdXAlMjBzdXBwb3J0cyUyMGF1dG9tYXRpYyUyMGNodW5raW5nJTIwYW5kJTIwbGF6eS1sb2FkaW5nJTVDbiUyMCUyMCUyMHZpYSUyMGR5bmFtaWMlMjBpbXBvcnRzJTIwdXRpbGl6aW5nJTIwdGhlJTIwaW1wb3J0JTIwbWVjaGFuaXNtJTVDbiUyMCUyMCUyMG9mJTIwdGhlJTIwaG9zdCUyMHN5c3RlbS4lMjAqJTJGJTVDbmNvbnN0JTIwRkxBRyUyMCUzRCUyMDAlNUNuJTVDbmNvbnN0JTIwcHJlcGFyZVRlc3REYXRhQXN5bmMlMjAlM0QlMjBhc3luYyUyMCgpJTIwJTNEJTNFJTIwJTdCJTVDbiU1Q3RzZXRUaW1lb3V0KCgpJTNEJTNFJTIwY29uc29sZS5sb2coJTVDJTIydGVzdCU1QyUyMiklMkMlMjAxMDAwKSU1Q24lN0QlNUNuJTVDbmNvbnN0JTIwcnVuJTIwJTNEJTIwYXN5bmMlMjAoKSUyMCUzRCUzRSUyMCU3QiU1Q24lNUN0aWYlMjAoRkxBRyUyMCUzRCUzRCUzRCUyMDEpJTIwJTdCJTVDbiU1Q3QlNUN0Y29uc29sZS5sb2coJTVDJTIyZmxhZyUyMCUzRCUzRCUzRCUyMDElNUMlMjIpJTVDbiU1Q3QlN0QlMjBlbHNlJTIwJTdCJTVDbiU1Q3QlNUN0Y29uc29sZS5sb2coJTVDJTIyZmxhZyUyMCUzRCUzRCUzRCUyMDAlNUMlMjIpJTVDbiU1Q3QlNUN0YXdhaXQlMjBwcmVwYXJlVGVzdERhdGFBc3luYygpJTVDbiU1Q3QlN0QlNUNuJTdEJTVDbiU1Q25ydW4oKSU1Q24lMjIlMkMlMjJpc0VudHJ5JTIyJTNBdHJ1ZSU3RCU1RCUyQyUyMm9wdGlvbnMlMjIlM0ElN0IlMjJmb3JtYXQlMjIlM0ElMjJlcyUyMiUyQyUyMm5hbWUlMjIlM0ElMjJteUJ1bmRsZSUyMiUyQyUyMmFtZCUyMiUzQSU3QiUyMmlkJTIyJTNBJTIyJTIyJTdEJTJDJTIyZ2xvYmFscyUyMiUzQSU3QiU3RCU3RCUyQyUyMmV4YW1wbGUlMjIlM0FudWxsJTdE

    你应该使用 rollup 或者 webpack 。

    tree shaking 一般是打包工具的职责,因为这种工作非常依赖模块分析。想让编译工具帮你做 tree shaking ,狗拿耗子了属于是
    mxT52CRuqR6o5
        8
    mxT52CRuqR6o5  
       2021-12-13 11:53:36 +08:00
    @liuidetmks
    因为先编译 es5 再 terser 分析不出来了吧,把去除 false 条件的 if 代码的工作放到编译 es5 之前就行了
    hronro
        9
    hronro  
       2021-12-13 12:20:59 +08:00
    @luob #7
    webpack 的 tree-shaking 就是交给 minifier 做的。🐶
    jones2000
        10
    jones2000  
       2021-12-13 13:07:37 +08:00
    正式版本不要写这几个测试函数,测试的时候,直接外部接入的方式把这 2 个测试函数加上不就可以了。
    ysc3839
        11
    ysc3839  
       2021-12-13 13:16:43 +08:00
    直接按“我想要的”那块代码那样写,然后在给 tsc 编译前先用 C 预处理器处理一遍即可。
    许多 ARM 的汇编器都是这么干的,而不是像一些 x86 汇编器内置宏功能。
    iqoo
        12
    iqoo  
       2021-12-13 14:27:14 +08:00
    可以间接支持。申明一个 declare const 变量,条件判断用 typeof 。

    当然生成的 JS 里仍存在条件不成立的代码,但 minify 之后就没了。

    举个例子:/github.com/EtherDream/freecdn-js/blob/master/loader-js/src/loader.ts#L85
    wszgrcy
        13
    wszgrcy  
       2021-12-13 14:33:38 +08:00
    可以写 transformer 进行静态分析.
    liuidetmks
        14
    liuidetmks  
    OP
       2021-12-13 15:52:57 +08:00
    @luob 目标代码 es5 ,debug code 包含多个 await 方法时候,你这个 tree-shaking 并不能正确工作
    DOLLOR
        15
    DOLLOR  
       2021-12-13 22:39:00 +08:00
    12101111
        16
    12101111  
       2021-12-13 23:26:36 +08:00
    直接调 C 语言的宏处理器不就行了 clang-cpp -DNODEBUG -E xxx.ts -o xxx.ts
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3123 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 00:36 · PVG 08:36 · LAX 16:36 · JFK 19:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.