在现代的前端开发中,构建工具扮演着重大的角色。构建工具不仅可以协助我们自动化地完成诸如编译、压缩、打包等繁琐的任务,还可以通过插件的形式扩展其功能。本文将介绍几个在构建工具中常用的插件,包括@rollup/plugin-commonjs、@rollup/plugin-node-resolve、@rollup/plugin-typescript和@rollup/plugin-replace
@rollup/plugin-commonjs
@rollup/plugin-commonjs 是一个用于 Rollup 构建工具的插件,它允许你在使用 Rollup 打包 CommonJS 模块时进行转换。CommonJS 是一种用于在浏览器之外执行 JavaScript 代码的模块规范,而 Rollup 默认只支持 ES 模块。这个插件的作用就是将 CommonJS 模块转换为 ES 模块,以便在 Rollup 中进行打包。使用 @rollup/plugin-commonjs,你可以在 Rollup 中引入和使用来自 npm 包的 CommonJS 模块,而无需手动进行转换。这个插件还支持一些高级功能,列如解析动态导入语法和处理循环依赖。通过在 Rollup 配置文件中添加 @rollup/plugin-commonjs,你可以更方便地使用 Rollup 打包项目中的 CommonJS 模块。
使用
npm安装@rollup/plugin-commonjs:
npm install @rollup/plugin-commonjs --save-dev
创建一个rollup.config.js配置文件并导入插件:
import commonjs from @rollup/plugin-commonjs ;
export default {
input: src/index.js ,
output: {
file: dist/bundle.js ,
format: esm
},
plugins: [commonjs()]
};
然后通过CLI或API调用rollup:
rollup -c
常用配置项
@rollup/plugin-commonjs提供了一些选项来自定义转换行为:
strictRequires:根据项目需求选择合适的模式,例如设置为true以保留Node.js语义,或设置为”auto”以在必要时包装CommonJS文件。
exclude 和 include:根据项目需求指定要忽略或包含的文件。可以使用picomatch模式来匹配文件路径。
extensions:指定在无扩展名导入时搜索的扩展名的顺序。
transformMixedEsModules:根据项目需求决定是否启用混合模块转换。
ignore:根据项目需求指定要保留未转换的require语句的模块。
下面是一些具体的使用案例:
设置strictRequires为true,默认值为”auto”,会在CommonJS依赖循环或条件导入时包装文件。设置为true时,将包装所有CommonJS文件以保留Node.js语义。设置为false时,不进行包装。还可以提供picomatch模式来指定需要包装的文件。
import commonjs from @rollup/plugin-commonjs ;
export default {
// ...
plugins: [
commonjs({
strictRequires: true
})
]
};
使用exclude和include来指定要忽略或包含的文件:
import commonjs from @rollup/plugin-commonjs ;
export default {
// ...
plugins: [
commonjs({
exclude: node_modules/** ,
include: [ src/**/*.js , lib/**/*.js ]
})
]
};
设置transformMixedEsModules为true,即控制是否启用混合模块转换。例如在包含ES import语句和CommonJS require表达式的模块,设置为true时,将将require调用转换为import语句。设置为false时,保留require表达式。
import commonjs from @rollup/plugin-commonjs ;
export default {
// ...
plugins: [
commonjs({
transformMixedEsModules: true
})
]
};
这些示例展示了如何根据具体需求配置@rollup/plugin-commonjs插件,以实现对CommonJS模块的转换和处理。根据项目的具体情况,可以选择适合的选项来优化构建过程和生成的代码。此外,此插件常与我们下文的@rollup/plugin-node-resolve一起使用。
@rollup/plugin-node-resolve
@rollup/plugin-node-resolve是一个Rollup插件,用于解析Node.js模块。它可以让Rollup打包时使用Node.js模块(包括外部依赖),而不仅仅是ES模块。该插件将检查模块的package.json文件以确定模块的主文件位置,并解决模块之间的依赖关系。此外,它还可以解析模块的绝对路径和相对路径,确保正确地解析和加载模块。
使用
确保你的Node版本是LTS版本(v14.0.0+),并且已经安装了Rollup(v2.78.0+)
使用以下命令安装@rollup/plugin-node-resolve插件:
npm install @rollup/plugin-node-resolve --save-dev
创建一个rollup.config.js配置文件并导入插件:
import { nodeResolve } from @rollup/plugin-node-resolve ;
export default {
input: src/index.js ,
output: {
dir: output ,
format: cjs
},
plugins: [nodeResolve()]
};
目前,你可以通过命令行或API调用Rollup来执行打包操作。此外如果你的包使用了package.json的exports或imports字段来指定入口点,插件会自动支持这个特性。如果没有指定这些字段,插件将使用mainFields字段来确定入口点。如果你的包中使用了一些内置模块(如fs、path),插件默认会优先使用这些内置模块。如果你想使用本地安装的同名模块,可以将preferBuiltins选项设置为false。
常用配置项
@rollup/plugin-node-resolve插件有一些常用的选项,下面是其中几个:
exportConditions:用于匹配解析模块时的额外条件。默认情况下,插件会使用[ default , module , import ]条件来解析导入语句。你可以通过设置exportConditions选项来添加额外的条件。例如:
exportConditions: [ node ]
browser:用于指定是否使用package.json中的browser模块解析规则。如果设置为true,插件将使用browser字段来解析模块。例如:
browser: true
moduleDirectories:用于指定递归查找模块的目录列表。默认情况下,插件会在node_modules目录中查找模块。你可以根据需要添加其他目录。例如:
moduleDirectories: [ node_modules , src/modules ]
dedupe:用于指定需要强制解析到根node_modules目录的模块列表,以避免重复打包一样的包。例如:
dedupe: [ my-package , @namespace/my-package ]
mainFields:用于指定在package.json中确定入口点时要扫描的属性列表。默认情况下,插件会使用[ module , main ]属性来确定入口点。你可以根据需要添加其他属性。例如:
mainFields: [ browser , module , main ]
下面是一个具体的使用案例:
import { nodeResolve } from @rollup/plugin-node-resolve ;
export default {
input: src/index.js ,
output: {
file: dist/bundle.js ,
format: cjs
},
plugins: [
nodeResolve({
exportConditions: [ node ],
browser: true,
moduleDirectories: [ node_modules , src/modules ],
dedupe: [ my-package , @namespace/my-package ],
mainFields: [ browser , module , main ]
})
]
};
@rollup/plugin-typescript
@rollup/plugin-typescript是一个用于Rollup构建工具的插件,用于将TypeScript代码转换为可在浏览器中运行的JavaScript代码。它提供了TypeScript的静态类型检查和编译功能,可以协助开发者在构建过程中捕获潜在的错误和问题。该插件还支持使用不同的TypeScript编译选项,如模块解析、代码压缩和输出格式等。使用@rollup/plugin-typescript,开发者可以更加高效地开发和构建TypeScript项目,并且能够轻松地与其他Rollup插件集成。无论是开发小型应用还是大型复杂项目,@rollup/plugin-typescript都是一个强劲且易于使用的工具,能够提升开发效率并提供更好的代码可维护性。
使用
确保你的Node版本是LTS版本(v14.0.0+),并且已经安装了Rollup(v2.14.0+)
使用npm安装@rollup/plugin-typescript:
npm install @rollup/plugin-typescript --save-dev
在项目根目录下创建一个名为rollup.config.js的文件,并添加以下内容:
import typescript from @rollup/plugin-typescript ;
export default {
input: src/index.ts ,
output: {
dir: output ,
format: cjs
},
plugins: [typescript()]
};
配置选项:@rollup/plugin-typescript支持一些配置选项,可以根据需要进行设置。以下是一些常用的选项:
exclude:指定要忽略的文件,可以使用picomatch模式进行匹配。
include:指定要处理的文件,可以使用picomatch模式进行匹配。
filterRoot:指定要解析include和exclude模式的目录。可以选择针对一个不同于当前工作目录(process.cwd())的目录来解析包括和排除模式。如果指定了一个字符串,则该值将被用作基本目录。相对路径将第一针对process.cwd()解析。如果为false,则模式将不会针对任何目录进行解析。
tsconfig:指定自定义的tsconfig文件。
typescript:指定自定义的TypeScript模块。
tslib:指定自定义的TypeScript助手模块。
transformers:允许注册自定义的TypeScript转换器,此高级配置提议看文档plugins/packages/typescript/README · rollup/plugins。
@rollup/plugin-replace
@rollup/plugin-replace是一个Rollup插件,它允许在打包过程中替换代码中的特定字符串。这个插件可以用来动态地替换配置文件中的常量,或者在不同环境中使用不同的变量。它还可以用来替换不同构建之间的代码,以便于在不同的构建之间进行比较和调试。@rollup/plugin-replace支持多种不同的替换方式,包括代码中的常量替换、环境变量替换和正则表达式替换等。它还可以与其他Rollup插件和工具一起使用,以便于更好地管理和控制代码库。
使用
使用npm命令安装@rollup/plugin-replace:
npm install @rollup/plugin-replace --save-dev
在项目根目录下创建一个名为rollup.config.js的文件,并添加以下内容:
import replace from @rollup/plugin-replace ;
export default {
input: src/index.js ,
output: {
dir: output ,
format: cjs
},
plugins: [
replace({
process.env.NODE_ENV : JSON.stringify( production ),
__buildDate__: () => JSON.stringify(new Date()),
__buildVersion: 15
})
]
};
上面的配置将替换所有包含在构建中的文件中的每个实例 process.env.NODE_ENV 为 production 和 __buildDate__ 为给定函数的结果。注意:值必须是原始类型(例如字符串、数字)或返回字符串的函数。对于复杂的值,请使用 JSON.stringify 。
常用配置项
values:这个选项用于指定要替换的目标字符串及其替换值。可以使用一个对象来定义多个替换规则。替换值可以是字符串或返回字符串的函数。实则际上就是上文书写模式的进阶版,以此避免与其他配置项混用。
replace({
values: {
process.env.NODE_ENV : "production" ,
__buildDate__: () => JSON.stringify(new Date()),
__buildVersion: 15
}
})
delimiters:这个选项用于指定替换字符串的边界。默认情况下,边界是单词边界,并且不会替换嵌套访问的实例。可以使用一个包含两个字符串的数组来定义边界。
replace({
delimiters: [ \b , \b(?!\.) ]
})
objectGuards:当替换类似于process.env.NODE_ENV这样的点分隔的对象属性时,还会替换对该对象进行typeof检查的代码。这个选项用于启用或禁用这种替换。
replace({
objectGuards: true
})
preventAssignment:这个选项用于防止在字符串后面紧跟一个等号时进行替换。可以用于避免错误的赋值操作。
replace({
preventAssignment: true
})
以上只是一些常用选项的示例,@rollup/plugin-replace还有其他选项可供使用。你可以参考官方文档@rollup/plugin-replace – npm以获取更详细的信息和更多的使用案例。
参考
rollup/plugins: 🍣 The one-stop shop for official Rollup plugins
@rollup/plugin-commonjs – npm
plugins/packages/typescript/README.md at master · rollup/plugins
@rollup/plugin-replace – npm



