umijs / father

NPM package development tool
MIT License
2.12k stars 273 forks source link

bug: umd 产物中的变量包含了项目路径 #749

Closed Dolov closed 5 months ago

Dolov commented 5 months ago

Version

4.4.0

OS Version

macos 14.3

Node.js Version

v16.19.0

Link to minimal reproduction

~

Steps to reproduce

image

What is expected?

不希望暴漏出项目路径

What is actually happening?

~

Any additional comments? (optional)

image
fz6m commented 5 months ago

有最小复现吗,只看图想不到具体的原因。

Dolov commented 5 months ago

有最小复现吗,只看图想不到具体的原因。

https://github.com/Dolov/ctrl-timer 一个我正在开发的工具库

fz6m commented 5 months ago

问题出在 eval 上,在你的代码里有 eval 的调用,eval 在运行的时候实际上可以更改你源码的上下文,所以变量、字符串等都不可以压缩,因为未来 eval 里可能去修改这些值。

father umd 默认使用的压缩器是 terser ,默认情况下,如果有 eval ,因为如上 eval 的行为,会避免压缩代码,通过如下配置可以强制压缩:

// .fatherrc.ts

  umd: {
    chainWebpack(config) {
      config.optimization.minimizer('js-terser').tap((args) => {
        args[0].terserOptions.mangle = {
          eval: true,
        }
        return args
      })
      return config
    },
  },

详见 terser options 文档。

另外在代码中使用 eval 是不安全的,不可以任意执行一段代码,这样会有很高的注入等安全风险,目前绝大多数第三方库都不会使用 eval ,只有极少数库在动态执行的时候会使用 Function 构造器模拟 eval (此处略,请自行研究),所以正常在浏览器运行的前端代码都不会有 eval ,如果你的代码只在 node 里运行,只打包 cjs / esm 即可,无需 umd (使用 umd 主要是为了在浏览器里使用)。

Dolov commented 5 months ago

好的,明白了,多谢