Vite: 关于Rollup打包 vite 打包配置

Vite: 关于Rollup打包概述
Rollup 是一款基于 ES Module 模块规范实现的 JavaScript 打包工具,在前端社区中赫赫有名,同时也在 Vite 的架构体系中发挥着重要作用不仅是 V

概述

Rollup 是一个基于ES Module 模块规范的JavaScript 打包工具,在前端社区中广为人知,在Vite 的架构体系中发挥着重要作用,同时也是Vite 的生产打包工具。它的插件机制也被Vite 使用、兼容,并且是Vite 的构建块。

快速上手

首先,使用$ npm init -y 创建一个新项目并安装汇总依赖项: $ pnpm i rollup。

接下来,添加三个文件:src/index.js、src/util.js 和rollup.config.js。目录结构如下:

包.json

pnpm-lock.yaml

rollup.config.js

来源

index.js

util.js

该文件的内容是:

//src/index.js

进口{

添加

来自\’./util\’;

控制台.log(添加(1, 2));

//src/util.js

导出const add=(a, b)=a + b;

导出const multi=(a, b)=a * b;

//rollup.config.js

//下面的注释是在VSCode 中使用类型提示

/**

* @type { import(\’rollup\’).RollupOptions }

*/

常量构建选项={

input: [\’src/index.js\’],

输出: {

//产品输出目录

dir: \’dist/es\’,

//产品格式

格式:\’esm\’,

},

};

导出默认构建选项。

您可以将以下构建脚本: 添加到package.json 中。

{

//Rollup打包命令,`-c`表示使用配置文件中的设置

\’build\’: \’汇总-c\’

}

然后在终端中运行$ npm run build,你将看到以下命令行信息:

您现在已经使用Rollup 创建了第一个产品。您可以通过导航到dist/es 目录来查看产品内容。

//dist/es/index.js

//代码打包在一起

const add=(a, b)=a + b;

控制台.log(添加(1, 2));

同时也可以看到util.js中的multi方法并没有被封装到产品中。这是Rollup 造成的。

它具有自然摇树功能,可以分析并自动清除未使用的模块。所谓Tree Shaking,也是计算机编译原理中DCE(Dead Code Elimination)技术的一种实现。这是因为ES 模块依赖关系是确定性的并且独立于运行时状态。因此,Rollup 可以在编译阶段分析依赖关系,并删除AST 语法树中未使用的节点,从而实现Tree Shaking。

常用配置

1)多产品组成

打包JavaScript 类库的场景通常涉及以各种格式发布产品以供其他用户使用。

除了ESM之外,我们还使用CommonJS、UMD等格式来保证良好的兼容性。那

那么如何使用相同的入口文件以不同的格式汇总打包您的产品呢?继续牢记上述内容

配置文件更改:

//rollup.config.js

/**

* @type { import(\’rollup\’).RollupOptions }

*/

常量构建选项={

input: [\’src/index.js\’],

//将输出更改为数组

输出: [{

dir: \’dist/es\’,

格式:\’esm\’,

},

{

dir: \’dist/cjs\’,

format: \’cjs\’,

},

],

};

导出默认构建选项。

从代码中可以看到,我们将输出属性配置到一个数组中,数组中的每个元素都是一个描述。

对象决定了各种产品的输出行为。

2)多入口配置

除了多产品配置之外,汇总还支持多条目配置,通常是两者的组合。

使用。接下来,继续转换之前的配置文件,将输入设置为数组或对。

如下所示的对象{

input: [\’src/index.js\’, \’src/util.js\’]

}

//或者

{

输入: {

Index: \’src/index.js\’,

util: \’src/util.js\’,

},

}

如果运行$ npm run build ,您可以看到它成功地为所有条目输出了不同格式的产品。

如果你有不同的封装配置对应不同的入口,也可以默认导出配置数组,如下图。 //rollup.config.js

/**

* @type { import(\’rollup\’).RollupOptions }

*/

常量buildIndexOptions={

input: [\’src/index.js\’],

输出: [

//省略输出设置

],

};

/**

* @type { import(\’rollup\’).RollupOptions }

*/

常量buildUtilOptions={

input: [\’src/util.js\’],

输出: [

//省略输出设置

],

};

导出默认值[buildIndexOptions, buildUtilOptions];

对于更复杂的打包场景(例如打包Vite源码本身),您可能需要将项目代码拆分成多个部分。

这种配置非常方便,因为各个部件分别封装在不同的卷绕配置中。

3)自定义输出配置

我们讨论了使用输入,输入主要用于声明条目,可以配置为字符串、数组或对。

它相对容易使用。相反,output用于设置与输出相关的信息。常用的设置包括:

//产品输出目录

dir: 路径.resolve(__dirname, \’dist\’),

//这些占位符可用于三个配置项:

//1. [name]: 去除文件扩展名后的文件名

//2. [hash]: 根据文件名和文件内容生成的哈希值

//3. [格式]: 产品模块格式(es、cjs等)

//4. [extname]: 产品后缀名(带“.”)

//入口模块输出文件名

入口文件名: `[name].js`,

//非入口模块的输出文件名(动态导入等)

chunkFileNames: \’块-[哈希].js\’,

//静态资源文件的输出文件名

assetFileNames: \’资产/[名称]-[哈希][扩展名称]\’,

//产品输出格式(`amd`、`cjs`、`es`、`iife`、`umd`、`system` 等)

format: \’cjs\’,

//是否生成source map文件

源图: 真实,

//如果是打包iife/umd格式,必须暴露全局变量,并通过name设置变量名

name: \’我的包\’,

//全局变量声明

全局: {

//你可以在项目中直接使用`$` 代替`jquery`

jquery: \’$\’

}

}

4)外部依赖

有些第三方包可能不想用Rollup打包,也可以使用external进行外部打包。

化工:

{

external: [\’反应\’,\’反应-dom\’]

}

该配置在搭建SSR或者使用ESM CDN的场景下非常有用。

5) 访问插件功能

日常使用Rollup时,难免会遇到一些Rollup本身不支持的场景,比如兼容性。

打包CommonJS、注入环境变量、配置路径别名、压缩生产代码等等。你现在需要我

我们引入了相应的Rollup 插件。现在我们通过一个具体的场景来了解Rollup插件。

零件的使用。

Rollup可以将产品以CommonJS格式打包输出,但是输入到Rollup中的代码是

不支持CommonJS。仅支持ESM。您可能认为这样您就可以直接在项目中使用ESM。

标准已经足够好了,但是除了考虑项目本身的代码之外,还有什么问题呢?

考虑第三方依赖性。目前,我们仅依赖CommonJS 格式的产品。

我们提供ESM 产品。例如,如果您的项目使用lodash,您将在打包的项目中看到以下错误:

因此,您需要引入额外的插件来解决这个问题。首先需要安装两个核心插件包:

$ pnpm 我@rollup/plugin-node-resolve @rollup/plugin-commonjs

@rollup/plugin-node-resolve 用于允许加载第三方依赖项。否则,像import React from \’react\’ 这样的依赖导入语句将不会被Rollup 识别。 @rollup/plugin-commonjs的作用是将CommonJS格式的代码转换为ESM格式。接下来,将这些插件导入到您的配置文件:conf 中。

//rollup.config.js

从“@rollup/plugin-node-resolve”执行导入解析。

从“@rollup/plugin-commonjs”导入commonjs。

/**

* @type { import(\’rollup\’).RollupOptions }

*/

默认导出{

input: [\’src/index.js\’],

输出: [{

dir: \’dist/es\’,

格式:\’esm\’,

},

{

dir: \’dist/cjs\’,

format: \’cjs\’,

},

],

//通过plugin参数添加插件

plugins: [resolve(), commonjs()],

};

现在我们以lodash为例来测试: $ pnpm i lodash,这是一个仅包含CommonJS产品的第三方包。

将以下代码: 添加到src/index.js。

从“lodash”导入{合并};

控制台.log(合并);

之后运行$ npm run build 确认生成成功。

在汇总配置文件中,插件不仅可以与输出配置在同一级别,还可以与输出配置在同一级别。

在输出参数中(例如,)

//rollup.config.js

从\’rollup-plugin-terser\’ 导入{terser}

从“@rollup/plugin-node-resolve”执行导入解析。

从“@rollup/plugin-commonjs”导入commonjs。

默认导出{

输出: {

//添加terser插件来压缩代码

插件: [terser()]

},

plugins: [resolve(), commonjs()]

}

当然,你也可以将上面的terser插件放在你最外层的插件配置中。

请注意,Output.plugins 中配置的插件有一定的限制。仅使用输出级。

只有具有相关钩子的插件才能放置在该配置中(具体内容下一节讨论)。您可以访问此站点查看Rollup 的输出插件列表。

另外,这里还有一些其他常用的rollup插件库。

@rollup/plugin-json:支持.json加载并与rollup的Tree Shaking机制配合使用。

按需删除未使用的部分并打包@rollup/plugin-babel:使用Babel 配合Rollup 进行JS 代码的语法转换@rollup/plugin-typescript: 支持使用TypeScript 开发@rollup/plugin -alias:支持别名设置。 @rollup/plugin-replace:替换rollups中的变量字符串rollup-plugin-visualizer:分析rollup包产品,自动生成产品量可视化分析图表

JavaScript API 方式调用

上面,我们结合Rollup的配置文件和rollup -c来完成Rollup的打包过程,但是在某些情况下,

在这种情况下,我需要基于rollup自定义一些打包流程,但配置文件目前还没有足够的灵活性。

要调用Rollup,需要使用相应的JavaScript API。 Rollup主要分为rollup.rollup和rollup.watch。

通过具体示例学习API。

第一个是rollup.rollup,用于一次性打包Rollups。您可以创建一个新的build.js,其中包含以下内容:

//构建.js

const rollup=require(\’rollup\’);

//常用的inputOptions设置

常量输入选项={

输入:\’./src/index.js\’,

外部:[],

插件:[]

};

const 输出选项列表=[

//常用的outputOptions设置

{

dir: \’dist/es\’,

入口文件名: `[name].[hash].js`,

chunkFileNames: \’块-[哈希].js\’,

assetFileNames: \’资产/[名称]-[哈希][扩展名称]\’,

格式: \’es\’,

源图: 真实,

全局: {

lodash: \’_\’

}

}

//省略其他输出设置

];

异步函数build() {

我们把它绑起来吧。

设置buildFailed=false。

尝试{

//1.调用rollup.rollup生成bundle对象

捆绑=等待rollup.rollup(inputOptions);

for (outputOptionsList 中的const OutputOptions) {

//2. 获取bundle对象,根据各个输出配置分别调用generate和write方法生成和写入产品。

持续的{

输出

=waitBundle.generate(outputOptions);

等待bundle.write(outputOptions);

}

} 捕获(错误){

构建失败=true;

控制台.错误(错误);

}

如果(捆绑){

//最后调用bundle.close方法完成打包

等待bundle.close();

}

process.exit(构建失败?1 : 0);

}

建造();

主要执行步骤如下:

通过rollup.rollup方法,传递inputOptions,生成bundle对象,调用bundle对象的Generate和write方法,传递outputOptions完成每一项。

产品、构建和磁盘刻录器调用捆绑对象的close 方法来完成打包。这样您就可以以编程方式完成汇总调用。

这就是包装过程。除了通过rollup.rollup完成一次性打包之外,还可以通过rollup.watch完成监控。

打包模式会在源文件发生更改时自动重新打包。可以新建一个watch.js文件,输入:下的内容。

//watch.js

const rollup=require(\’rollup\’);

const 观察者=rollup.watch({

//与rollup配置文件基本相同的属性,除了添加`watch`配置

输入:\’./src/index.js\’,

输出: [{

dir: \’dist/es\’,

格式:\’esm\’,

},

{

dir: \’dist/cjs\’,

format: \’cjs\’,

},

],

观看: {

排除: [\’node_modules/**\’],

include:[\’src/**\’],

},

});

//观察各种事件

watcher.on(\’重新启动\’, ()={

console.log(\’重建.\’);

});

watcher.on(\’变化\’, (id)={

console.log(\’修改模块id:\’, id);

});

watcher.on(\’事件\’, (e)={

if (e.code===\’BUNDLE_END\’) {

console.log(\’包装信息:\’, e);

}

});

现在,您可以通过在修改文件时运行节点watch.js 来打开汇总的监视打包模式。

您将看到以下日志:这表明rollup被自动重新打包并触发了相应的事件回调函数:

修改模块id: /xxx/src/index.js

重建.

包装信息:

{

代码:“Bundle_END”,

期间: 10,

输入:\’./src/index.js\’,

输出: [

//输出产品路径

],

结果: {

缓存: {

/* 产品特定信息*/},

close: [AsyncFunction: 关闭],

关闭: 假,

generate: [AsyncFunction: 生成],

watchFiles: [

//监听文件列表

],

write: [AsyncFunction: 写入]

}

}

基于以上两个JavaScript API,您可以在代码中轻松调用Rollup打包流程。

您可以使用这些API 在代码中控制汇总打包过程。

也可定制和二次开发

以上#Vite:汇总包信息仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92684.html

(0)
CSDN's avatarCSDN
上一篇 2024年6月28日 上午9:13
下一篇 2024年6月28日 上午9:46

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注