rollup的使用
1、安装
npm install rollup -D
2、rollup命令执行方式
1、找到可执行文件直接执行
./node_modules/.bin/rollup
2、通过package.json中的scripts字段执行
配置
"scripts":{
"dev":"rollup"
}
调用
npm run dev
3、全局安装rollup也可以直接执行。不做赘述。
3、简单示例
(1)、准备
创建一个空目录,在当前目录下打开命令行
npm init
npm install rollup -D
(2)、配置
package.json
"scripts":{
"dev":"rollup -wc rollup-config-dev.js"
}
rollup-config-dev.js
const path = require('path')
const inputPath = path.resolve(__dirname,'./src/index.js')
const outputPath = path.resolve(__dirname,'./dist/test')
module.exports = {
input:inputPath,
output:{
file:outputPath,
format:'umd',
name:'bwdemo'
}
}
模块化规范:
format
的值支持umd
,cjs
,es
umd`可在浏览器直接运行
es``需要type="module"
支持
<script src="" type="module"></script>
4、进阶用法
(1)多出口配置
rollup-config-dev.js
const path = require('path')
const inputPath = path.resolve(__dirname,'./src/index.js')
const outputPath = path.resolve(__dirname,'./dist/test')
module.exports = {
input:inputPath,
output:{
file:outputPath,
format:'umd',
name:'bwdemo'
}
}
(2)加载模块压缩等
i:安装插件
rollup-plugin-node-resolve
该插件允许引入第三方模块
npm install rollup-plugin-node-resolve -D
rollup-config-dev.js配置
const resolve = require('rollup-plugin-node-resolve')
...
module.exports = {
input:inputPath,
output:[{
file:outputUmdPath,
format:'umd',
name:'bwdemo'
},{
file:outputEsPath,
format:'es'
}],
plugins:[
resolve()
]
}
babel-node
babel-core
在node中直接使用es6模块
npm install @babel/node -g
npm install @babel/core -g
npm install @babel/preset-env -D
如果报错找不到babel/core模块,则在当前项目再安装一下
npm install @babel/core -D
配置.babelrc
,参考官网配置
{
"presets": [
[
"@babel/env",
{
"targets": {
"edge": "17",
"firefox": "60",
"chrome": "67",
"safari": "11.1"
},
"useBuiltIns": "usage",
"corejs": "3.6.5"
}
]
]
}
执行
babel-node index.js
rollup-plugin-babel
插件**
有些es6新特性在打包时不会转化为es5版本的,比如箭头函数,此时就应该加装上babel插件
安装
npm install rollup-plugin-babel -D
使用
const babel = require('rollup-plugin-babel')
...
plugins:[
babel({
exclude:'node_modules/**'
})
]
然后就会将es6的语法打包时编译为es5的
测试时rollup-plugin-bael版本为
4.4.0
,没有将es6的转换为es5,可能是浏览器已经能直接运行箭头函数了什么的语法了。如果确实像亲见这个编译过程,请在.babelrc
中将目标浏览器调低:
{
"presets": [
[
"@babel/env",
{
"targets": {
"ie":"6"
},
"useBuiltIns": "usage",
"corejs": "3.6.5"
}
]
]
}
ii: tree-shaking
shaking 英[ˈʃeɪkɪŋ]抖(掉)
大意就是文件树精简。
plugin.js
const a = 1;
const b = 2;
function random(){
console.log('random')
return '666'
}
export default {
a,
b,
random
}
index.js
import data from './plugin'
console.log(data.random(),data.a,data.b)
export default data.random
打包好的文件 test.es.js
const a = 1;
const b = 2;
function random(){
console.log('random');
return '666'
}
var data = {
a,
b,
random
};
console.log(data.random(),data.a,data.b);
var index = data.random;
export { index as default };
tree-shaking给这三个文件带来的改变
plugin.js
export const a = 1;
export const b = 2;
export function random(){
console.log('random')
return '666'
}
export default {}
index.js
import { random } from './plugin'
console.log(random())
export default random
打包好的文件 test.es.js
function random(){
console.log('random');
return '666'
}
console.log(random());
export { random as default };
iii: 外部类库设置 external
有些场景下,虽然我们使用了resolve插件,但我们仍然需将某些库保持外部引用状态,这时我们就需要使用external属性,告诉rollup.js哪些是外部的类库,修改rollup.js的配置文件:
添加external配置项
...
external:[
'the-answer'
]
...
index.js
import answer from 'the-answer'
import { random } from './plugin'
console.log(random(),answer)
export default random
打包好的文件test.es.js
import answer from 'the-answer';
function random(){
console.log('random');
return '666'
}
console.log(random(),answer);
export { random as default };
其中answer模块依然作为一个外部模块被引入,而不是将其内容都打包到test.es.js文件中
iv: commonjs
模块
如果代码中使用import引入了commonjs规范的模块,则使用babel-node可以执行,但如果打包的话会报错,需要借助commonjs模块。
安装:
npm install rollup-plugin-commonjs -D
配置文件修改:
const commonjs = require('rollup-plugin-commonjs')
...
module.exports = {
plugins:[
commonjs()
]
}
cjs.js
let a = 1;
module.exports.a = a
index.js
import number from './cjs.js'
console.log(number)
v: rollup-plugin-babel
插件
有些es6新特性在打包时不会转化为es5版本的,比如箭头函数,此时就应该加装上babel插件
安装
npm install rollup-plugin-babel -D
使用
const babel = require('rollup-plugin-babel')
...
plugins:[
babel({
exclude:'node_modules/**'
})
]
然后就会将es6的语法打包时编译为es5的
测试时rollup-plugin-bael版本为
4.4.0
,没有将es6的转换为es5,可能是浏览器已经能直接运行箭头函数了什么的语法了。如果确实像亲见这个编译过程,请在.babelrc
中将目标浏览器调低:
{
"presets": [
[
"@babel/env",
{
"targets": {
"ie":"6"
},
"useBuiltIns": "usage",
"corejs": "3.6.5"
}
]
]
}
vi: rollup-plugin-json
插件
当打包文件时,rollup不支持引入json文件,通过
rollup-plugin-json
模块可实现该功能。
安装
npm install rollup-plugin-json -D
配置
const json = require('rollup-plugin-json')
....
module.exports = {
....
plugins:[
json()
]
}
使用
import pkg from '../package.json'
console.log(pkg)
vii: rollup-plugin-terser
插件
压缩js文件的插件
安装
npm install rollup-plugin-terser -D
配置
const { terser } = require('rollup-plugin-terser')
module.exports = {
...
plugins:[
terser()
],
}
package.json
...
"scripts": {
"dev": "rollup -wc rollup-config-dev.js",
"build:prod": "rollup -c rollup-config-prod.js"
},
...
(3)打包vue文件
i:rollup-plugin-vue
插件,支持处理.vue后缀的文件。
安装
npm install rollup-plugin-vue -D
npm install @vue/compiler-sfc -D
npm install rollup-plugin-postcss -D
npm install sass -D
配置
需要注意的是,尽量把vue()在数组中放到靠前的位置
const path = require('path')
const vue = require('rollup-plugin-vue')
const postcss = require('rollup-plugin-postcss')
const outputEsPath = path.resolve(__dirname,'./dist/test.es.js')
module.exports = {
input:inputPath,
output:[{
file:outputEsPath,
format:'es',
globals:{
vue:'vue'
}
}],
plugins:[
vue(),
postcss({
plugins:[]
})
]
}
(4)、添加eslint校验
eslint官方文档
安装
npm install eslint -D
交互命令配置eslint
./node_modules/.bin/eslint --init
//一次选择如下选项
To check syntax only
JavaScript modules(import/export)
vue.js
Does your project use TypeScript? No
Where does your code run?--->Browser
...其他项根据自己的项目情况定制
.eslintrc.js最终内容
module.exports = {
"env": {
"browser": true,
"es2021": true
},
"extends": ["plugin:vue/essential","eslint:recommended"],
"parserOptions": {
"ecmaVersion": 12,
"sourceType": "module"
},
"plugins": [
"vue"
],
"rules": {
}
};
package.json中添加命令
"scripts": {
"lint":"eslint ./src"
}
(5)、按需加载
借助babel-plugin-component
可以实现按需加载,vue中不需要手动安装,已经自带了
安装
npm install babel-plugin-component -D
修改.babelrc
{
"presets":[["es2015",{"modules":fase}]],
"plugins":[
"component",
{
"libraryName":"element-ui",
"styleLibraryName":"theme-chalk"
}
]
}
实现按需加载

Test
目录中的Test/Test.vue
为组件本身,Test/index.js
中注册组件,代码如下:
import Test from './Test.vue'
export default function(Vue){
Vue.component('TestOne',Test)//这个组件名称即将来在应用中使用的组件名
}
//src/index.js为组件库入口文件
import Test1 from './Test'
import Test2 from './Test2'
import Test3 from './Test3'
export const Test = Test1//使用export即可实现单个组件导出
export default function(Vue){
Vue.use(Test2)
Vue.use(Test3)
}