杂谈
现在技术圈越来越流行一个概念,那就是所谓的 一次开发,多端运行, 基于此出现了大量的库,比如Taro、uniapp,我们利用这些库可以将编写的应用程序发布到很多终端,从而实现所谓的“多端运行”。这个目标是很伟大的,因为这样可以大大解放生产力,不需要为每一个终端配备一个开发,而是“一把梭”就可以了
我自己实际使用过Taro开发过小程序,整体体验下来还是不错的,打包出来的小程序性能与原生开发相差无几,但对于某些终端下的个别api支持存在一些问题,当然这也是场景的复杂性所必然会出现的,但我相信随着技术迭代,这些都不是问题,并且 大一统 肯定是未来技术发展的趋势,因为任何可以解放生产力的工具都会成为主流,这是社会发展的必然趋势
说了这么多,说回本文的主题,在webpack里其实也提供类似 一次开发,多端运行 的功能,那便是 target,通过它我们可以将编写的程序构建成适配 目标环境 的产物,并且使用方式十分简单,下面进入正题吧!
详解构建目标(target)
在webpack里,target指定构建产物所要运行的 环境,从而在构建过程中,会启用不同的 插件 以适配不同的环境
target的默认值为 browserslist,如果没有找到browserslist的配置,则默认为 web,target的可选值如下:
- async-node:编译为类 Node.js 环境可用(使用 fs 和 vm 异步加载分块)
- electron-main:编译为 Electron 主进程
- electron-renderer:编译为 Electron 渲染进程,使用 JsonpTemplatePlugin
- electron-preload:编译为 Electron 渲染进程
- node:编译为类 Node.js 环境可用(使用 Node.js require 加载 chunks)
- web:编译为类浏览器环境里可用 (默认)
- webworker:编译成一个 WebWorker
- esX:编译为指定版本的 ECMAScript。例如,es5,es2020
- browserslist:从 browserslist-config 中推断出平台和 ES 特性 (如果 browserslist 可用,其值则为默认)
需要注意的是如果传递多个目标,如target: ['web', 'es5']
,那么将使用共同的特性子集,但并不是所有的target都可以进行混合,比如 node 和 web 就不能一起使用,因为webpack暂时不支持 universal 的target
如果webpack里的预设target都不符合需求,可以将target设置为 false,这将告诉webpack不使用任何插件,同时可以使用自己想用的插件来满足特定场景的需求
结语
“一次开发,多端运行”的概念越来越火,大一统的趋势已经不断显现,我相信未来肯定会有一种技术来兼容所有的终端,彻底解放生产力,但真到了那一天,对于我们程序员来说,是好还是坏,需要画一个大大的问号了,over!