端技术范围不断发展,前端开发不仅限于直接编写html,css和javascript,Web应用日益庞大,代码也更加庞大,因此许多新的思想(例如模块化和工程化等)和框架(React和Vue等),以及新的语言(Es6 TypeScript)随之出现,而构建工具则承担起了中间的桥梁作用。
正文构建工具最直接的作用是:将源码转换成可执行的js,css和html,具体包括:
构建其实是工程化和自动化思想的再前端的体现:将一系列流程用代码自动去实现,解放生产力。
常见前端构建工具的分类和对比npm是nodejs附带的包管理器,npm script是npm内置的一个功能,允许在package.json文件里面使用script字段定义任务:
{
"scripts":{
"dev":"node dev.js",
"pub":"node build.js"
}
} 在这里,一个属性对应一段shell脚本,原理是通过调用shell去运行脚本命令。
module.exports = function(grunt){
//插件的配置信息
grunt.initConfig({
uglify:{
app_task:{
files:{
'build/app.min.js':['lib/index.js','lib/test.js']
}
}
}
})
...
} 基于流的自动化构建工具。除了可以管理和执行任务,还支持监听读写文件。简单例子:
var gulp = require('gulp'); //引用基础模块
var uglify = require('gulp-uglify'); //js压缩模块
gulp.task('script',function(){ //启动任务script
gulp.src('js/*.js') //找到文件
.pipe(uglify()) //压缩文件
.pipe(gulp.dest('dist/js')) //另存压缩文件
});
//监听
gulp.task('auto',function () {
gulp.watch('js/*.js',['script']); //监听script任务
gulp.watch('css/*.css',['css']); //监听css任务
gulp.watch('images/*.*',['images']); //监听images任务
}); fis3相对于前面的工具,集成了Web开发中常用的构建功能:
match配置压缩器,实现前端工程优化CssSprite(雪碧图)配置,合并多个css导入的图片到一个图片,减少http请求webpack是一个打包模块化js的工具,在webpack里,一切文件都是模块,通过Loader转换文件,通过plugin注入钩子,最后输出由多个模块组成的文件。webpack专注于构建模块化项目。
Rollup是一个类似于Webpack模块打包工具,但专注于ES6的模块化。
Tree Shaking(简单介绍剔除无效代码,稍微详细点就是可以去除已经被定义却没被使用的代码并进行Scope Hoisting(作用域提升),以减小输出文件的大小和提升运行性能。)code Spliting(对打包生成的bundle.js文件进行分割成chunk块),所以没有模块加载、执行和缓存的代码。好处是打包js库时,文件更小,但是功能不够完善parcel是一款刚诞生不久的新型打包器,并且短短几周内就获得大量赞同。
当项目比较庞大时,需要引入不同的库,带来了以下问题:
不同库命名空间冲突(例如jq和zepto都使用了window.$)
库之间有依赖,需要控制加载顺序
需要管理库的版本
这种情况下,模块化的思想出现了:将复杂系统分割成多个模块以方便开发。 主要的模块划规范:
一种js模块化规范,commonJS的核心是通过requrire方法,同步加载所依赖的其他模块,通过module.exports导出需要的接口,具体使用方式在此不深入
另一种js模块化规范,与 commonJS的关键区别是异步加载所依赖的模块。AMD主要针对浏览器环境的模块化,代表实现是requirejs
ES6在语言层面实现模块化,通过使用import和export导入和导出模块。ES6的模块化将要逐渐取代Commonjs和AND规范,是模块化的终极解决方案。
前端工程化的意义,是为了提高编码->测试->维护 的运行效率,主要从开和部署两方面来入手:开发方面需要做好代码规范和开发模块化;部署阶段的主要流程包括:
从前文对构建工具的介绍可以看出,这里的性能优化主要以下方面:
Sprite(雪碧图)技术热重载也就是自动刷新,主要是监听本地源代码变化,自动重新构建和刷新浏览器,随着新的技术框架的出现,例如Vue,React等,这门技术也基本成为了开发标配。
参考资料,吴浩麟《深入浅出 Webpack》
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2567/viewspace-2806611/ ,如需转载,请注明出处,否则将追究法律责任。