V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
Sparetire
V2EX  ›  JavaScript

Typescript 动态导入模块要怎么做?

  •  
  •   Sparetire · 2019-02-16 18:12:31 +08:00 · 8446 次点击
    这是一个创建于 2105 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想要在 typescript 中扫描一个目录, 然后导入该目录下的所有文件, 但是这样的话, 文件路径是运行时确定的, 有什么办法吗?

    第 1 条附言  ·  2019-02-16 19:03:58 +08:00
    补充: 是 Node 环境, 其实我就是想扫描一个目录下的 router 注册下
    13 条回复    2019-02-17 00:50:53 +08:00
    azh7138m
        1
    azh7138m  
       2019-02-16 18:20:11 +08:00 via Android
    按照 js 的模式,就 require ;
    或者做 code generate ?文件在打包的时候就要确定有哪些文件
    VDimos
        2
    VDimos  
       2019-02-16 18:21:29 +08:00 via Android
    用 webpack 才能实现,和 js 一样,用 import + async 或者 require 实现
    menyakun
        3
    menyakun  
       2019-02-16 19:03:05 +08:00
    import('./dir/' + filename).then(...) webpack 会帮你好这件事,但这样的话这个目录下所有文件都会打包到 bundle 里面
    Sparetire
        4
    Sparetire  
    OP
       2019-02-16 19:03:07 +08:00
    @azh7138m require 的话会丢失类型吧, 需要手动 as 吗? 这个路子好像可以...
    Sparetire
        5
    Sparetire  
    OP
       2019-02-16 19:04:16 +08:00
    @menyakun
    @VDimos
    是 Node 环境, 其实我就是想扫描一个目录下的 router 注册下
    azh7138m
        6
    azh7138m  
       2019-02-16 19:43:58 +08:00 via Android
    @Sparetire 那没有必要强类型,或者说这里强类型的意义何在。。。
    加载路由肯定是框架做的吧,控制器算业务的吧,按道理也不会耦合,用 any 就行,或者直接当 baseController 用就行吧
    vghdjgh
        7
    vghdjgh  
       2019-02-16 19:54:55 +08:00
    ES static import 必须是确定的模块路径,ES dynamic import 还不被 nodejs 默认支持( Experimental https://nodejs.org/dist/latest-v11.x/docs/api/esm.html ),所以默认只能用 require,需要类型信息的话用 as 来标注
    momocraft
        8
    momocraft  
       2019-02-16 19:58:54 +08:00
    文件名都不知道類型自然更不知道
    你仍然可以 require, 只是 require 得到的東西自己解決類型
    Sparetire
        9
    Sparetire  
    OP
       2019-02-16 20:01:45 +08:00
    @azh7138m emm, 好像也是...那就这样吧
    只是想自己拿着 koa 照着 egg 撸一下, koa 不帮我加载路由咯
    azh7138m
        10
    azh7138m  
       2019-02-16 20:35:06 +08:00 via Android
    @Sparetire 其实也可以不用扫
    写一个 router 的装饰器来收集这些东西也是可以的
    azh7138m
        11
    azh7138m  
       2019-02-16 20:36:46 +08:00 via Android
    哦,想错了,node 上面文件还没加载进来,忽略我吧
    VDimos
        12
    VDimos  
       2019-02-16 20:46:39 +08:00 via Android
    静态类型必须在编译时确定,没有指定路径是无法确定的,所以不能实现你的需求
    thomaspaine
        13
    thomaspaine  
       2019-02-17 00:50:53 +08:00
    @Sparetire require 会丢类型,但是你需要批量 require 的地方,比如统一注册路由信息,需要类型信息吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   987 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 20:22 · PVG 04:22 · LAX 12:22 · JFK 15:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.