首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

巧用 exports 和 typeVersions 提升 npm 包用户使用体验

一般而言会涉及两个字段main和export,它们会涉及到当前模块在被导入的行为。...但是如果想实现更精细化的导出控制就无法满足 当我们一个库本身同时包含运行时和编译时的导出时,如果我们导出的模块在编译时(node 环境)包含副作用,如果运行时模块也从同一入口导出就会出现问题 // 例如编译时入口存在以下编译时副作用...库使用者也不需关心从统一入口导入的方法到底是编译时方法还是运行时方法 这个时候就可以利用package.json的exports字段进行导出,当存在该字段时会忽略main和module字段。.../lib/*.js" } } 类型 按照上述操作完成后,打包就能符合相关预期,但是对于 typescript 文件的导入如果使用runtime路径是会找不到相应的类型文件,typescript 并不会去识别该字段...如果找到了对应的模块文件,则直接返回该路径;否则抛出错误 通过相关上述代码我们可以知道 对于解析es导入,webpack会尝试读取exports字段的导出,依次读取import和node字段。

58710

源码阅读 | 第一期 : 名称解析

crate 的模块在这里构建,宏的路径、模块导入、表达式、类型、模式、标签(label)和生命周期 都是在这里解析的 类型相关的名称解析(方法、字段、关联项)发生在rustc_typeck 上。...第二阶段是从整个映射中根据一个名称来查找定义。这样做的目的是解耦。 当前 RFC 1560 已经被实现,在宏扩展期间不会做 全名解析,只解析导入和宏。...我对 Rustc 如何检查未使用变量比较感兴趣,就让我们聚焦 check_unused.rs 模块中的相关功能。...该模块注释中写道,检查未使用的导入主要分为三步: 第一步:UnusedImportCheckVisitor 来遍历 AST 以查找UseTree内所有未使用的导入,并且记录它们的 use分组和 NodeId...: lib.rs 中定义主要的 Resolver相关类型和方法 在不同的 Resolver 功能模块中实现具体的 解析方法,比如 check_unused 回到整体模块 然后,我们再回到整体模块中来了解其他部分的代码

1.7K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Create React App 源码揭秘

    阻止用户从src/(或node_modules/)外部导入文件。 InterpolateHtmlPlugin。...PnpWebpackPlugin, // 阻止用户从src/(或node_modules/)外部导入文件。...// 为了解决这个问题,我们阻止你从src/导入文件——如果你愿意, // 请将这些文件链接到node_modules/中,然后让模块解析开始。...这经常会引起混乱,因为我们只使用babel处理src/中的文件。 为了解决这个问题,我们阻止你从src/导入文件——如果你愿意, 请将这些文件链接到node_modules/中,然后让模块解析开始。...,可自行选择构建工具,依赖管理,单元测试等配套设施 各模块仓库体积一般不会太大 使用多个仓库管理的缺点 仓库分散不好找,当很多时,更加困难,分支管理混乱 版本更新繁琐,如果公共模块版本变化,需要对所有模块进行依赖的更新

    3.7K20

    官宣 Rust 2021 Edition 计划 一睹为快

    增补 Prelude 标准库的 Prelude [4]是一个模块,该模块包含了标准库中其他每个模块必须自动导入的所有内容。...默认 Cargo Feature 解析器(Resolver) 从Rust 1.51.0开始,Cargo 支持了可选的新的 Feature 解析器[8],可以通过Cargo.toml中的resolver...从 Rust 2021 开始,这将是默认设置。也就是说,在Cargo.toml中写入edition ="2021" 会暗含 resolver ="2"。...闭包中不相关的捕获 闭包(Closure) [10]会自动从上下文捕获其引用的任何内容。例如,|| a + 1会自动从周围的上下文中捕获对a的引用。 当前,即使仅使用一个字段,也将影响整个结构。...("{}", a.y); // Error: Tries to capture all of `a` c(); 从 Rust 2021 开始,闭包将仅捕获其使用的字段。

    2.1K40

    Nginx DNS解析漏洞PoC公开细节

    漏洞描述 5月26日,由绿盟科技CERT监测到Nginx发布安全公告,修复了一个Nginx解析器中的DNS解析程序漏洞(CVE-2021-23017),由于ngx_resolver_copy处理DNS响应时存在错误...解析器(core/ngx_resolver.c)可以在设置解析器原语时,通过DNS解析多个模块的主机名 ngx_resolver_copy()会被调用以验证和解压缩DNS响应中包含的每个DNS域名,接收作为输入的网络包和指向正在处理的域名的指针...,并在成功时返回指向包含未压缩域名的新分配缓冲区的指针。...整个过程分为两步执行: 1、计算未压缩域名的大小len并验证输入数据包,丢弃包含128个以上指针或超出输入缓冲区边界指针的域名 2、分配一个输出缓冲区,并将未压缩的域名复制到其中 第1部分中的大小计算和第...2部分中的域名解压之间的不匹配会导致len中的off-by-one错误,从而允许在name->data数据边界之外写入一个点字符 当压缩域名的最后一部分包含指向NULL字节的指针时,就会发生计算错误的情况

    3.4K50

    CVE-2021-23017:nginx DNS解析漏洞PoC公开

    ()中的一个off-by-one错误将允许网络攻击者在堆分配的缓冲区中写入超出边界的点字符(‘.’, 0x2E)。...漏洞成因分析 nginx的DNS解析器(core/ngx_resolver.c)可以在设置解析器原语时,通过DNS解析多个模块的主机名。...ngx_resolver_copy()会被调用以验证和解压缩DNS响应中包含的每个DNS域名,接收作为输入的网络包和指向正在处理的域名的指针,并在成功时返回指向包含未压缩域名的新分配缓冲区的指针。...整个过程分为两步执行: 计算未压缩域名的大小len并验证输入数据包,丢弃包含128个以上指针或超出输入缓冲区边界指针的域名。 分配一个输出缓冲区,并将未压缩的域名复制到其中。...第1部分中的大小计算和第2部分中的域名解压之间的不匹配会导致len中的off-by-one错误,从而允许在name->data数据边界之外写入一个点字符。

    13.9K50

    Nginx域名解析流程,源码分析

    尝试发送解析多次后,解析失败 最后调用wirte输出错误 ?...可以看到声明了dns查询,以及红黑树缓存dns数据,以及IPv6的处理 nginx在初始化的时候,通过core/ngx_resolver.c中的ngx_resolver_create来初始化上面的结构体...自动跳转,接着判断url中变量数量,根据数量判断是http还是https协议,接着还是通过调用ngx_http_upstream_add,将域名添加到upstream解析队列中,所以所有的调用解析,还是从upstream...整个过程总结如下: proxy_pass http://$host; ngx_resolver_ctx_t ctx 每次域名解析都会生成这个结构体, 直接malloc,未使用r->pool.ctx =...过程比较复杂,总的来说,当proxy_pass后面是连接的时候,即使不定义upstream,nginx也会隐式的,将proxy_pass后面的url创建一个upstream,由upstream模块进行调用

    6.6K21

    创建模块实例,为模块解析准备

    模块构建之解析_source获取dependencies 8. 从dependency graph 到 chunk graph 9. 从chunk到最终的文件内容到最后的文件输出?...---- 上一节说到normalModuleFactory.create来创建模块实例,下面从该方法开始分析创建模块实例需要哪些准备工作。...的目的是解析loader和resource等信息,创建模块实例需要用到 hooks.factory钩子的目的是创建模块实例 注意这两个订阅函数的执行结果是返回一个函数:factroy()、resolver...() resolver(): 收集各种模块构建过程中需要的信息 该部分有大量代码解析loader,下面先介绍下loader的特性。...被忽略的文件不应调用 import、require、define 或任何其他导入机制。当忽略大型库时,这可以提高构建性能。

    77440

    golang源码分析:grpc 链接池(3)resolver 、balancer和picker

    ),每次客户端请求的时候根据picker提供的Pick接口,从连接池中选择一个SubConn来完成请求。...resolver 与 balancer 都是抽象的,内建的 resolver 包括 dns、manual、passthrough,内建的 balancer 包括 roundrobin、grpclb。...当然也可以基于插件化的 Register 模式来在模块自身的 init() 函数中将自己注册。...Close() } 当我们调用Dial获取连接池的时候,首先是获取resolver,通过解析target,获得schema,然后通过schema在全局注册表中找到对应的resolver,需要注意的是,我们在自定义...resolver的时候引用的grpc版本一定要和发起连接的时候的grpc版本一致,否则会出现resolver找不到使用默认的passthrough的情况,这是踩坑的血泪记忆。

    1.3K20

    Rust 2021 版本特性预览,以及工作计划

    您可以在 RFC 中,阅读到更多关于版本演变的信息。 特性是否会包含在 Rust 2021 中,是 RFC 审定过程的一部分。因此,从当前到发布的这段时间内,特性列表仍然可能会改变。...请注意,RFC 尚未合并,prelude 的新内容仍在积极讨论中。 新的闭包捕获规则 RFC 2229 建议:在可能的情况下,闭包捕获单个字段,而非整个结构体。此 RFC 已被接受。...Cargo 新特性 resolver 在 Rust 1.51 中,Cargo 将有一个稳定的新特性 resolver(详细请参阅 Rust 1.51.0 已正式发布,及其新特性详述),resolver...在 Rust 2021 版本中,这个新的 resolver 将成为默认的。但是 Rust 2018 版本中,仍然可以对新的 resolver 选择使用。...和 core 中的 panic,以及将一些 lint 从警告升级为错误。

    91820

    从构建进程间缓存设计 谈 Webpack5 优化和工作原理

    再谈文件监听和缓存:unsafe cache 上面我们更多提到了模块缓存的概念。除了模块之外,还有个不可忽视的缓存目标,我们称之为 resolver's unsafe cache。...什么是 resolver's unsafe cache 呢?我们先要从 Webpack 中 resolver 这个概念说起。Webpack 带来的一大理念是:一切皆模块。...:提供文件路径解析功能,用于普通文件导入 contextResolver:提供目录路径解析功能,用于动态文件导入 loaderResolver:提供文件路径解析功能,用于 loader 文件导入 在 Webpack...从数据类型和结构上来说,JSON 无疑是一个最好的选择。配合 JSON 数据,我们实现读写磁盘上的模块缓存数据以及每个模块的状态字段,这个模块状态字段将会在校验缓存可用性的阶段派上用场。...面向普通开发者的缓存需求 对于普通开发者,最核心的需求当然是可以依靠缓存系统完成构建的绝对量级优化。同时需要对未开启缓存的性能不优化型构建进行提示,且该提示应该是可关闭的。

    84320
    领券