前端模块化开发篇之grunt&webpack篇
几个月前写了一篇有关gulp和browserify来做前端构建的博客,因为browserify用来做js的打包时可能有些麻烦(特别是在写React的时候),所以这里再强烈推荐一款js打包工具-webpack。webpack很强大,不光可以模块化加载js,甚至还有jsx,css,图片等等。可以看看webpack托管到github的官网,相信你看一眼就能懂webpack的强大之处了。进入webpack官网>>
= =说到此处,不免有些尴尬,由于博主的英文so 一般,对webpack的认识还不够深,这里仅仅只做一个大概的讲解。同样的,我也没有在webpack社区中找到有关css压缩的插件,所以只能用grunt来做有关css的打包,但grunt与webpack并不冲突而且grunt的社区非常成熟,只要是你能想到的插件在grunt官方都是有滴(并不代表我都用过~)。
好,进入正题。因为我们用到webpack,所以我们还是用react框架来配合这次演示,当然我们css是用grunt来进行合并压缩的。在编写代码前,我们需要安装npm,grunt以及webpack。这里我就不再多说了,大家可以移步到npm的官网,上面可以找到具体的安装细节。npm社区>>
第一步先建立一个工作目录,2016-3-5。然后我们使用npm init (或者 cnpm init)进行项目的初始化。

第二步就可以开始编写js和css文件了。由于我们用的是React框架,因此我们采用jsx语法来书写,文件当然也得保存为.jsx的格式,我们直接引用facebook官方给出的一个小demo(好吧,其实是博主懒得自己写了...),保存为LikeButton.jsx,然后再编写两个css文件,用来模拟合并和压缩,分别保存为LikeButton1.css和LikeButton2.css。代码如下:
LikeButton.jsx:
var React = require('react');
var ReactDOM = require('react-dom');
var LinkButton = React.createClass({
getInitialState: function() {
return {
liked: false
};
},
handleClick: function(event) {
this.setState({
liked: !this.state.liked
});
},
render: function() {
var text = this.state.liked ? 'like' : 'haven\'t liked';
return(
<p onClick={this.handleClick}>
You{text} this. Click to toggle.
</p>
);
}
});
ReactDOM.render(<LinkButton/>,document.body);
LikeButton1.css:
*{
margin: 0px;
padding: 0px;
}
LikeButton2.css:
p{
width: 500px;
background-color: #000;
color: #fff;
}
哈哈,为了演示grunt,我也蛮拼的写了两个这么简短的css。接下来我们开始配置grunt和webpack的任务。
grunt的任务需要在根目录下编写一个名叫Gruntfile.js的文件,而webpack则需要在根目录下编写一个名叫webpack.config.js的文件。先列出代码,再来进行详细讲解。
Gruntfile.js:
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
cssmin: {
options: {
shorthandCompacting: false,
roundingPrecision: -1
},
target: {
files: {
'./LikeButton.min.css': [
'./LikeButton1.css',
'./LikeButton2.css'
]
}
}
}
});
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.registerTask('default',['cssmin']);
}
grunt的配置分三步,第一步是配置任务,即grunt.initConfig({});第二步是加载任务插件;第三步注册可执行的任务命令。
一般第一步是需要自己手动配置的,grunt有很多很多的插件,而今天介绍的css压缩合并只用到了grunt-contrib-cssmin的插件。首先看到pkg:grunt.file.readJSON('package.json')这行,有时候我们需要将一些grunt任务基本信息放在package.json中,就需要将这个文件转换为一个js对象,然后可以用来在这个文件中进行调用。接下来就是一个key: value的形式会一直出现,代表任务名:任务的进本信息。比方说这个cssmin就是grunt的任务名,等会我要压缩合并文件时就只需在控制台输入grunt cssmin。
任务内部应该怎么写?这个由于插件的大不相同可能写法也不同,推荐大家去github或者是npm社区去看官方文档的写法。grunt-contrib-cssmin官方文档>>。
第二步的加载插件,只需要grunt.loadNpmTasks('插件名')即可,记得要npm 这个插件哦。
第三步的任务注册,grunt.registerTask('default',['cssmin'])。数组写上所有你在第一步构建的方法,而default则可以把所有的方法一键完成,在命令行只需输入grunt,则所有任务自行执行完毕。

接下来看看我们的文件LikeButton.min.css:

我们的Grunt出色的完成它的任务~哈哈,虽然只是两个文件,但是当你面对n个文件时,并且进行性能提升,Grunt会成为你很好的帮手。而React的出现,又使Webpack这款工具彻彻底底的火了!
我来说说我为什么要使用webpack把,之前我是使用gulp+browserify来进行构建React的,可是我觉得真的好难配置,特别是前端到了越来越注重模块化开发的时代,什么图片,css都要这样,所以webpack便成为最好的选择。废话不多说,直接进入webpack.config.js的配置!
webpack.config.js:
var webpack = require('webpack');
module.exports = {
entry: {
LikeButton: './LikeButton.jsx'
},
output: {
path: './',
filename: '[name].js'
},
module: {
loaders: [
{
test: /\.jsx$/,
loader: 'jsx-loader'
}
]
}
}
对于webpack的配置,其实更通俗易懂。entry,作为入口点,用key-value的格式标明了在webpack任务中这个文件的一个引用。后面的output对象,需要指明路径path以及输出文件名filename,其中的[name]就是entry中的key。而module中的Loaders数组就是我们用到的webpack插件,这里是一个jsx转换器"jsx-loader",我们用正则找到所有jsx结尾的文件来进行转换。
整个webpack的配置很简单,但是webpack功能不止如此,博主也在学习中,可以参考webpack在github上的文档>>.

执行完webpack后控制台会有一些信息的输出,这个时候你的jsx文件已经打包为js文件了,不过...这个文件确实是有点大,因为里面包含了整个react的框架,但是当多个jsx或者js打包时我们可以创建一个common的js来提取公共部分。
webpack和grunt大大提升了开发效率,所以在这里强力推荐~
前端模块化开发篇之grunt&webpack篇的更多相关文章
- 前端模块化开发学习之gulp&browserify篇
随着web应用的发展,前端的比重占得越来越多,编写代码从而也越来越复杂.而通常我们需要将不同功能或者不同模块的代码分开写,最后在html中一起加载,这样做是可以的,但是当你需要进行维护或者是二次开发 ...
- JavaScript学习总结(六)——前端模块化开发
早期的javascript版本没有块级作用域.没有类.没有包.也没有模块,这样会带来一些问题,如复用.依赖.冲突.代码组织混乱等,随着前端的膨胀,模块化显得非常迫切. 前端模块化规范如下: 一.前端模 ...
- 初学seaJs模块化开发,利用grunt打包,减少http请求
原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...
- [整理]前端模块化开发AMD CMD
前端模块化开发的价值 AMD (中文版) CMD 模块定义规范 标准构建 http://seajs.org http://chaoskeh.com/blog/why-seajs.html http:/ ...
- legend3---11、php前端模块化开发
legend3---11.php前端模块化开发 一.总结 一句话总结: 把常用的前端块(比如课程列表,比如评论列表)放进模块列表里面,通过外部php变量给数据,可以很好的实现复用和修改 页面调用 @p ...
- 前端模块化开发的价值(seaJs)
随着互联网的飞速发展,前端开发越来越复杂.本文将从实际项目中遇到的问题出发,讲述模块化能解决哪些问题,以及如何使用 Sea.js 进行前端的模块化开发. 恼人的命名冲突 我们从一个简单的习惯出发.我做 ...
- JAVAScript:前端模块化开发
目录 一:前端模块化概要 1.1.模块化概要 1.2.函数封装 1.3.对象封装 1.4.立即执行函数表达式(IIFE) 1.5.模块化规范 1.5.1.CommonJS 1.5.2.AMD((Asy ...
- web前端学习路线:HTML5教程之前端模块化开发
1. 命名冲突 首先从一个简单的习惯开始. 由于以前一直做 JavaEE 开发的缘故,在 JavaScript 开发中,我已经习惯将项目中的一些通用功能抽象出来,形成一个个的独立函数,以便于实现代码复 ...
- 【PC网站前端架构探讨系列】结合公司网站首页,谈前端模块化开发与网站性能优化实践
说在前面 上午给大家分享的个人认为比较全,比较官方,比较清晰的grunt使用教程,被挪出首页了,不过没关系,毕竟不是原创,大家想看,我现在贴出地址: http://www.cnblogs.com/sy ...
随机推荐
- Codevs 1138 聪明的质监员 2011年NOIP全国联赛提高组
1138 聪明的质监员 2011年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小 T 是一名质量监督员, ...
- bzoj4330:JSOI2012 爱之项链
题目大意:一串项链由n个戒指组成,对于每个戒指,一共有M个点,R种颜色,且旋转后相同的戒指是相同的,然后一串项链又由N个戒指组成,同时要满足相邻的两个戒指不能相同,这串项链上某个位置插入了一个特殊的东 ...
- 关于web开发的一点理解
对于web开发上的一点理解 1 宏观上的一点理解 网页从请求第地址 到获得页面的过程:从客户端(浏览器)通过地址 从soket把请求报文封装发往服务端 服务端通过解析报文并处理报文最后把处理的结果 ...
- 【转】PHP程序员的技术成长规划
按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定 ...
- 常用的工具GCC GDB Make Makefile
系统调用系统调用是操作系统提供给外部应用程序的一组特殊的接口.应用程序通过这组特殊“接口”来获得操作系统内核提供的服务.在 C 语言中,操作系统的系统调用通常通过函数调用的形式完成, 这是因为这些函数 ...
- HTTP协议-标签简介
这个系列的文章要讨论的是如何通过ASP.net服务器端技术来优化客户端缓存策略,而且让这种策略变得可配置和可扩展.我们要了解的知识从HTTP协议中相关属性对客户端缓存的影响,到ASP.NET如何控制这 ...
- 微信分享功能引入页面-控制分享时候调用的标题、图片、url和微信按钮隐藏显示控制
1.设置分享调用的标题.图片.url预览. 2.控制右上角三个点按钮的隐藏显示(和底部工具栏的显示隐藏--未测试). 3.判断网页是否在微信中被调用. <!doctype html> &l ...
- Python的面向对象2
我们接着讲解Python的面向对象 1.初始化实例属性 在现实生活中,一种类型的实例会具有相同的某些属性,把这些实例划分为一个类型,则这些实例必然有相似的部分.但是,在创建实例之后,我们一个一个的为实 ...
- HTML 页面加载动画效果
浏览器:Chrome, IE <!doctype html> <html> <head> <title>CSS transform: CSS only ...
- eclipse开发android程序常见问题解决办法
1:R.java不自动更新或不见,gen文件夹里没生成文件. 解决办法: 这个一般是xml文件中有错误,如有英文大写,属性值错误等,解决了就会好. 如果错都排除了还没有生成或更新,那么可以点击proj ...