浅析前端依赖知识体系:依赖是什么(可执行代码与声明)、npm i 的依赖机制、node应用如何使用依赖(声明)、web应用的模块化导致依赖复杂、webpack如何把依赖打包(代码与声明)、组件开发如何更好的被依赖

  vite 构建的核心工具是 rollup.js。同样的, rollup 也是个打包器。它也不得不面对 webpack 面对的那两个问题:(1)怎么打包 一堆代码(2)怎么打包 一个声明

1、vite/rollup怎么处理一堆代码?

相比于 webpack 所设计的复杂的 chunkmodule 等加载体系, rollup 显然纯粹的多,它默认只提供了 6种文件输出结构。而 vite 在这一点上显然更加激进,它最低以 es2015 作为自己的兼容标准,也就是构建输出的乃是 ESM 模块。

参考 vite 官网的描述:https://cn.vitejs.dev/guide/build.html#browser-compatibility

因而,在兼容性上, vitewebpack 要弱,带来的好处也是显而易见的:

  • 制品结构清晰、不冗余、体积小。
  • 好理解( ESM),不用去学 webpackJsonp 是啥了。

当然,官方也给出了更低版本浏览器兼容的法门,按需要使用吧。

2、vite/rollup怎么处理一个声明?

  vite 没有直接提供类似加载 CDN 依赖的配置。但社区提供了类似的插件,比如: vite-plugin-cdn-import。

rollup,如果你的目标构建格式是 umd,那么它的 globals 配置,正是用来处理这个问题的。

上面两节我们从 webpackvite 大致了解了 web 应用构建过程中对依赖的处理。那么,当我们开发组件时,要怎么做才能更好地扮演自己作为 被依赖者 的角色呢?

1、组件应该输出什么格式?

大多数情况下: ESMUMD 就够了,如果你的组件需要在 node.js 环境运行,那可能还需要加上 CommonJS 格式。

按照本文之前的说法,两种格式分别应对两种场景:

  • ESM: 作为 一堆代码 被引用。
  • UMD: 作为 一个声明 的实际支撑,被用作 CDN 引入页面。

因为 rollup.js/vite 默认支持输出 ESMUMD,所以 rollup/vite 实在是开发组件的利器。

值得一提的是, rollup.js 默认行为会把所有的模块打包到一个 js 文件里,这行为显然不符合当下 按需加载 的思路。

因此,通过 preserveModules: true 配置选项,可以让 rollup 只编译,不打包,输出完美的散装 esm 文件格式。

2、在组件内如何 只声明、不打包

这是组件开发者永远无法绕开的问题,因为你必须想清楚。你开发 Element Plus,不可能内置一套 vue3 吧?按照本文【第二节】的描述,作为一个组件,你应该正确地 声明自己的依赖

(1)输出 ESM:通过 rollup external 配置和 package.json dependencies

  rollupexternal,和 webpackexternals 的作用类似,但存在差异。

rollup external 的作用是:指定部分依赖不打包到制品中,但是在代码中保留 import xxx from 'bar' 这样的语句。为了配合这个语法,我们应该把实际依赖声明到 package.jsondependencies 中。

这样当其他应用依赖组件时,会按照【本文第二节】的内容进行安装,并从 node_modules 中去寻找依赖。

(2)输出 UMD:通过 rollup output.globals 配置。

rollupoutput.globals,和 webpackexternals 是真的像!

不仅写法像,它们的作用也像:

(1)被声明 globals 的库,不会被打包到制品中

(2)被引用时会去浏览器的 window 上通过别名寻找

通过以上两个思路,可以成功解决组件内 只声明、不打包 的需求。

Original: https://www.cnblogs.com/goloving/p/16528196.html
Author: 古兰精
Title: 浅析前端依赖知识体系:依赖是什么(可执行代码与声明)、npm i 的依赖机制、node应用如何使用依赖(声明)、web应用的模块化导致依赖复杂、webpack如何把依赖打包(代码与声明)、组件开发如何更好的被依赖

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/547523/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球