# 与webpack类似的工具有哪些?谈谈你为什么选择使用或者放弃webpack?
# grunt
自动化,对于需要反复重复的任务,如压缩、编译、单元测试等,自动化工具可以减轻你的劳动,简化你的工作。当你在gruntfile文件正确配置好了任务,任务运行器会自动帮你完成大部分重复的工作。
最老牌的打包工具,它运用配置的思想来写打包脚本,一切皆配置。
优点:出现的比较早
缺点:
- 配置项比较多
- 不同的插件可能会有自己扩展的字段
- 学习成本高,运用的时候需要明白各种插件的配置规则和配置方式
安装
cnpm i grunt grunt-babel @babel/core @babel/preset-env -D
Gruntfile.js
module.exports = function (grunt) {
// 加载babel任务
grunt.loadNpmTasks('grunt-babel')
// 初始化配置文件
grunt.initConfig({
babel: {
options: {
sourceMap: true,
presets: ['@babel/preset-env']
},
dist: {
files: {
'dist/app.js': 'src/app.js'
}
}
}
})
// default指的是入口任务
grunt.registerTask('default', ['babel'])
}
# gulp
基于node.js的stream流打包
定位是根据任务流的自动化构建工具
Gulp是通过task对整个开发过程进行构建
优点:
- 流式的写法简单直观
- API简单,代码量少
- 易于学习和使用
- 适合多页面应用开发
缺点:
- 异常处理比较麻烦
- 工作流程顺序难以精细控制
- 不太适合单页面或自定义模块的开发
# 全局安装
cnpm install gulp-cli -g
# 项目中安装
cnpm install gulp gulp-babel @babel/core @babel/preset-env -D
# 创建配置文件
npx -p touch nodetouch gulpfile.js
gulpfile.js
const gulp = require('gulp')
const babel = require('gulp-babel')
function defaultTask(cb) {
gulp
.src('src/app.js') // 读取源文件
.pipe(
babel({ // 传给babel任务
presets: ['@babel/preset-env']
})
)
.pipe(gulp.dest('dist')) // 写入dist文件
cb()
}
exports.default = defaultTask
# webpack
- webpack是模块化管理工具和打包工具。通过loader的转换,任何形式的资源都可以视作模块儿。比如commonjs模块、AMD模块es6模块、CSS、图片儿等。它可以将许多松散的模块儿按照依赖和规则,打包成符合生产环境部署的前端资源。
- 还可以将按需加载的模块进行代码分割,等到实际需要的时候再异步加载。
- 它定位是模块打包器,而grunt/gulp属于构建工具。Webpack可以代替Gulp/grunt的一些功能,但不是一个职能的工具。可以配合使用。
优点:
- 可以模块化的打包任何资源。
- 适配任何模块儿的系统。
- 适合spa单页应用的开发。 缺点:
- 学习成本高,配置复杂。
- 通过Babel编译后的js代码打包后体积过道。
安装
cnpm i webpack webpack-cli babel-loader @babel/preset-env @babel/core -D
webpack.config.js
const path = require('path')
module.exports = {
mode: 'development',
devtool: false,
entry: './src/app.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.jsx?$/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
},
include: path.join(__dirname, 'src'),
exclude: /node_modules/
}
]
},
plugins:[],
devServer: {}
}
# rollup
- rollup下一代es6模块打包工具,最大的亮点是利用es6模块设计,利用吹tree-shaking生成更简洁、更简单的代码。
- 一般而言,对于应用使用Webpack,对于类库使用rollup
- 需要代码拆分或者很多静态资源需要处理,再或者构建的项目需要引入很多CommonJS模块的依赖时,使用Web pack。
- 代码库是基于es六模块,而且希望代码能够被他人直接使用,使用rollup。
优点:
- 使用标准化的格式来写代码,通过减少死代码尽可能的缩小包体积。
← 编写plugin