Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,例如 library 或应用程序。Rollup 对代码模块使用新的标准化格式,这些标准都包含在 JavaScript 的 ES6 版本中,而不是以前的特殊解决方案,如 CommonJS 和 AMD。ES6 模块可以使你自由、无缝地使用你最喜爱的 library 中那些最有用独立函数,而你的项目不必携带其他未使用的代码。ES6 模块最终还是要由浏览器原生实现,但当前 Rollup 可以使你提前体验
rollup
使用很简单,它不需要像webpack
那样进行繁琐的配置
首先全局安装,然后只需要指定入口文件和格式化方式就能直接使用
再加一个文件出口路径,就可以生成打包文件
全局安装rollup
npm i -g rollup
命令行直接编译文件(结果会直接显示在终端)
rollup --input src/index.js --format cjs
rollup -i src/index.js -f cjs
简写
rollup src/index.js -f cjs
省略入口-i
标志
编译打包文件
rollup src/index.js -f cjs --file dist/bundle.js
rollup src/index.js -f cjs -o dist/bundle.js
使用配置文件和插件
rollup --config rollup.config.js
rollup -c ./build/rollup.config.js
-c
后面跟配置文件,是根目录下的 rollup.config.js
时,可以省略
// 配置文件一般形式如下:
module.export = {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'cjs', // amd、cjs、es、iife、umd
},
plugins: [
]
}
// 创建文件夹
mkdir rollup-demo && cd rollup-demo
// 创建package.json
npm init -y
// 安装rollup (最新版是1.21.0,使用有点问题,暂用1.20.3)
npm i -D rollup@1.20.3
// 安装es6模块插件
npm i -D rollup-plugin-babel @babel/core @babel/preset-env
// class 与 属性
npm i -D @babel/plugin-transform-classes @babel/plugin-proposal-class-properties
// 开发环境 安装serve 和 热加载 插件
npm i -D rollup-plugin-serve rollup-plugin-livereload
// 生产环境 安装压缩代码插件(不用uglify,因为不能指定压缩文件)
npm i -D rollup-plugin-terser
// css处理
npm i -D rollup-plugin-postcss
// 合起来,一个命令
npm i -D rollup@1.20.3 rollup-plugin-babel @babel/core @babel/plugin-transform-classes @babel/preset-env @babel/plugin-proposal-class-properties rollup-plugin-serve rollup-plugin-livereload rollup-plugin-terser rollup-plugin-postcss
在package.json
中添加命令
"dev": "rollup -w -c ./build/rollup.config.dev.js",
"build": "rollup -c ./build/rollup.config.prod.js"
创建一个build文件夹,在里面建三个配置文件
基础配置./build/rollup.config.js
const path = require('path');
const postcss = require('rollup-plugin-postcss')
const babel = require('rollup-plugin-babel');
const resolveFile = function(filePath) {
return path.join(__dirname, '..', filePath)
}
const isProductionEnv = process.env.NODE_ENV === 'production'
module.exports = [
{
input: resolveFile('src/index.js'), // 入口文件
output: [{
file: resolveFile('dist/index.js'), // 输出 JS 文件
format: 'umd',
name: 'Demo'
},{
file: resolveFile('dist/index.min.js'), // 输出 JS 压缩文件
format: 'umd',
name: 'Demo'
},{
file: resolveFile('dist/index.es.js'), // 输出 JS es 文件
format: 'es'
}],
plugins: [ // 插件
postcss({
extract: resolveFile('dist/index.css'),
minimize: isProductionEnv,
}),
babel() // 编译 es6+, 配合 .babelrc 文件
],
},
]
开发模式./build/rollup.config.dev.js
process.env.NODE_ENV = 'development';
const path = require('path');
const serve = require('rollup-plugin-serve');
const configList = require('./rollup.config');
const livereload = require('rollup-plugin-livereload');
const resolveFile = function(filePath) {
return path.join(__dirname, '..', filePath)
}
const PORT = 3000;
configList.map((config, index) => {
config.output.sourcemap = true;
if( index === 0 ) {
config.plugins = [
...config.plugins,
...[
livereload({ // 启动重载,并且监听dist目录
watch: resolveFile('dist'),
// port: 35729 // default。 同时启动两个项目时,要修改此端口
}),
serve({
port: PORT,
contentBase: [resolveFile('example'), resolveFile('dist')],
// contentBase: [resolveFile('')],
open: true,
verbose: true, // 打印输出 serve路径
})
]
]
}
return config;
})
module.exports = configList;
生产模式./build/rollup.config.prod.js
process.env.NODE_ENV = 'production';
const {terser} = require('rollup-plugin-terser');
const postcss = require('rollup-plugin-postcss')
const configList = require('./rollup.config');
const resolveFile = function(filePath) {
return path.join(__dirname, '..', filePath)
}
configList.map((config, index) => {
config.output.sourcemap = false;
config.plugins = [
...config.plugins,
...[
terser({ // 只压缩 *.min.js文件
include: [/^.+\.min\.js$/, '*esm*'],
exclude: [ 'some*' ]
})
]
]
return config;
})
module.exports = configList;
.babelrc
文件 {
"presets": [
["@babel/preset-env", { "modules": false }]
],
"plugins": [
["@babel/plugin-proposal-class-properties", {
"loose": true
}],
["@babel/plugin-transform-classes", {
"loose": true
}]
]
}
src/index.js
文件作为入口文件 import './index.css'
class Demo {
constructor() {
this.name = 'zhang san'
this.age = 18
document.write(`${this.name}`)
document.write(`${this.age}`)
}
changeName() {
this.name = 'li si'
document.write(`${this.name}`)
}
changeAge = () => {
this.age = 28
document.write(`${this.age}`)
}
}
export default Demo;
example/index.html
作为开发示例页面
title
使用sass
npm i -D node-sass
已经装了postcss,sass在这可以直接用
使用eslint
npm i -D rollup-plugin-eslint eslint-config-airbnb-base eslint-plugin-import
添加.eslintrc
文件
修改rollup.config.dev.js
文件
const {eslint} = require('rollup-plugin-eslint')
...
...
config.plugins = [
...config.plugins,
...[
eslint(), // 添加eslint插件
livereload({...})
]
]
...
创建.eslintrc
和.eslintignore
// .eslintrc
{
"extends": "airbnb-base",
"env": {
"browser": true
},
"rules": {
"import/extensions": ["error", "always", {
"js": "never",
"vue": "never"
}],
"semi": ["error", "never"],
"comma-dangle": ["error", {
"arrays": "always-multiline",
"objects": "always-multiline",
"imports": "always-multiline",
"exports": "always-multiline",
"functions": "ignore"
}],
"no-underscore-dangle": "off",
"import/prefer-default-export": "off",
"class-methods-use-this": "off",
"object-curly-newline": ["error", {
"minProperties": 3,
"consistent": true
}],
"no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 1 }],
"linebreak-style": [0, "error", "windows"],
"no-param-reassign": ["error", { "props": false }],
"array-bracket-spacing": ["error", "always", {
"objectsInArrays": false,
"arraysInArrays": false
}],
"max-len": ["error", {
"code": 200,
"ignoreUrls": true,
"ignoreComments": true
}]
}
}
// .eslintignore
.git
.idea
.vscode
build
dist
node_modules
现在执行npm run dev
试试,修改一下src/index.js
中的报错吧
插件
rollup
众多功能都是通过插件扩展的,插件名称一般形如:rollup-plugin-xxxx
,可以在npm网站搜索需要的功能插件
livereload (热加载与服务)
serve({
port: 3000,
open: true,
}),
livereload({
watch: 'dist',
port: 35729
})
// livereload这里有个默认端口 35729,issue里有提到
// 同时启动了两个的时候会报错,端口冲突,这里最好给它一个端口
// 开发用的时serve端口,而不是livereload的
https://chenshenhai.github.io/rollupjs-note/