Rollup 是一个用于 JavaScript 的模块打包工具,它将小的代码片段编译成更大、更复杂的代码。
vite 是基于 rollup 的,所以学习 rollup 是很有必要的
安装
pnpm install rollup
创建在根目录 rollup.config.js
export default {
//文件入口点
input: "src/main.js",
//输出配置
output: {
file: "dist/bundle.cjs.js", //输出文件的路径和名称
format: "cjs", //五种输出格式:amd/es6/iife/umd/cjs
name: "bundleName", //当format为iife和umd时必须提供,将作为全局变量挂在window下
},
};
src\main.js
console.log("hello");
package.json
因为 rollup.config。使用的是 es 模块,所以需要配置 type 为 module
不然会报错
! RollupError: Node tried to load your configuration file as CommonJS even though it is likely an ES module. To resolve this, change the extension of your configuration to ".mjs", set "type": "module" in your package.json file or pass the "--bundleConfigAsCjs" flag.
Original error: Unexpected token 'export'
{
"type": "module",
"scripts": {
"build": "rollup --config"
},
}
打包结果
"use strict";
console.log("hello");
使用 Babel 可以将 ES6+ 代码转换为向后兼容的 JavaScript 版本,以便在旧版浏览器中运行。
安装依赖
pnpm install @rollup/plugin-babel @babel/core @babel/preset-env --save-dev
src\main.js
let sum = (a, b) => {
return a + b;
};
let result = sum(12, 24);
console.log(result);
.babelrc
.babelrc 文件是 Babel 的配置文件
{
"presets": [
[
"@babel/env",
{
// "modules": false 表示不转换模块语法(比如 import 和 export)
"modules": false
}
]
]
}
rollup.config.js
import babel from "@rollup/plugin-babel";
export default {
//插件
plugins: [
babel({
//排除node_modules下的文件
exclude: "node_modules/**",
}),
],
};
打包结果
这个就是 babel 转换后的结果
"use strict";
var sum = function sum(a, b) {
return a + b;
};
var result = sum(12, 24);
console.log(result);
src\main.js
import { name, age } from "./module.js";
console.log(name);
src\module.js
export const name = "张三";
export const age = 18;
打包结果
"use strict";
var name = "张三";
console.log(name);
age 变量引入了,但是没有使用,所以打包结果中没有 age 变量
如果不安装 tslib,会报错
! RollupError: plugin typescript @rollup/plugin-typescript: Could not find module 'tslib', which is required by this plugin. Is it installed?
安装依赖
pnpm install tslib typescript @rollup/plugin-typescript --save-dev
src\main.ts
const name1: string = "张三";
const age: number = 18;
console.log(name1, age);
tsconfig.json
tsconfig.json 文件是 TypeScript 的配置文件
{
// compilerOptions: 编译选项
"compilerOptions": {
"target": "es5", // 编译后的版本
"module": "ESNext", // 模块化方案
"strict": true, // 启用所有严格类型检查选项
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
}
}
rollup.config.js
import typescript from "@rollup/plugin-typescript";
export default {
//插件
plugins: [typescript()],
};
打包结果
"use strict";
var name1 = "张三";
var age = 18;
console.log(name1, age);
terser 是支持 ES6 +的 JavaScript 压缩器工具包
安装依赖
pnpm install rollup-plugin-terser --save-dev
rollup.config.js
import typescript from "@rollup/plugin-typescript";
import { terser } from "rollup-plugin-terser";
export default {
//插件
plugins: [typescript(), terser()],
};
打包结果
"use strict";
console.log("张三", 18);
pnpm install postcss rollup-plugin-postcss --save-dev
src\main.ts
引入 main.css
import "./main.css";
const name1: string = "张三";
const age: number = 18;
console.log(name1, age);
src\main.css
body {
background-color: green;
}
rollup.config.js
import postcss from "rollup-plugin-postcss";
export default {
//插件
plugins: [
postcss({
extract: true, // 将 CSS 提取到独立文件
minimize: true, // 压缩 CSS
}),
],
};
打包结果
bundle.cjs.js
"use strict";
console.log("张三", 18);
bundle.cjs.css
body {
background-color: green;
}
安装依赖
pnpm install rollup-plugin-serve --save-dev
rollup.config.js
import serve from "rollup-plugin-serve";
export default {
//插件
plugins: [
serve({
// open: true, // 自动打开浏览器
port: 8080, // 监听端口
contentBase: "./dist", // 静态文件目录
}),
],
};
安装依赖
pnpm install cross-env @rollup/plugin-replace --save-dev
rollup.config.js
import replace from "@rollup/plugin-replace"; //替换
const isDevelopment = process.env.NODE_ENV === "development"; // 判断是否为开发环境
export default {
//插件
plugins: [
replace({
"process.env.NODE_ENV": JSON.stringify(
process.env.NODE_ENV || "development"
), // 替换环境变量
preventAssignment: true, // 解决警告
}),
// 仅在开发环境启用 serve 插件
isDevelopment &&
serve({
// open: true, // 自动打开浏览器
port: 8080, // 监听端口
contentBase: "./dist", // 静态文件目录
}),
],
};
rollup.config.js
"scripts": {
"build": " cross-env NODE_ENV=production rollup --config",
"dev": " cross-env NODE_ENV=development rollup --config -w"
},
rollup.js 编译源码中的模块引用默认只支持 ES6+的模块方式 import/export
安装依赖
pnpm install @rollup/plugin-node-resolve @rollup/plugin-commonjs @types/lodash lodash --save-dev
rollup.config.js
import resolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
export default {
//插件
plugins: [resolve(), commonjs()],
};
rollup.config.js
import _ from "lodash";
import "./main.css";
console.log(_);
const name1: string = "张三";
const age: number = 18;
console.log(name1, age);
报错
import _ from 'lodash'; 模块 ""D:/xue/rollup/node_modules/.pnpm/@types+lodash@4.17.16/node_modules/@types/lodash/index"" 只能在使用 "allowSyntheticDefaultImports" 标志时进行默认导入 ts(1259)
tsconfig.json
{
"compilerOptions": {
"allowSyntheticDefaultImports": true // // 启用合成默认导入
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。