做为一个Java开发者,原来写js代码都是流水帐式的,一直想写出模块化的js,可是前端工具多如牛毛,确都是针对于nodejs的打包工具。可是我在实际的开发过程当中,并无使用到太多的js库,通常只使用到boostrap、jquery和其相关的插件,并不想引入nodejs和各类前端插件来增长项目的复杂度。requirejs彻底符合个人要求,还能够配合maven实现自动打包和压缩代码。下面咱们来简单介绍一下requirejs,实如今开发阶段,不打包,不压缩,模块化开发;部署阶段,自动打包、压缩。
requirejs是JS模块化开发的框架,它遵循AMD(Asynchronous Module Definition)规范,实现js脚本的异步加载,不阻塞页面的渲染和其后的脚本的执行。使用requirejs能够简化js的依赖,咱们无需在html文件中使用<script>
标签引入大量的js文件,只需引入少许的require.js
文件,其余的js文件均可以经过requirejs引入。javascript
define(id?, dependencies?, factory);
html
npm install –g requirejs
前端
<script src="https://cdn.bootcss.com/require.js/2.3.5/require.js"></script>
java
<script src="scripts/require.js"></script>
若是须要使用其余的js,只需在require。config.js之中导入对应模块便可。node
在模块中引入其余模块的语法为:jquery
require(['jquery'], function($) { //回调函数 });
在回调函数中咱们就能够使用jquery中的$
符号了。
固然咱们只会引用其余的模块是确定不行的,咱们还须要定义符合AMD规范的模块。git
自定义模块的语法为:github
define(["jquery"], function($) { });
define({ username: "yoojoo", email: "yookoo@163.com", gender: "男" })
这个模块是一个依赖于jquery的匿名模块,在requirejs中定义匿名模块也是模块定义的最佳实践,他将以对应的文件名做为模块的模块名。ajax
requirejs.config({ baseUrl: '/public/js', paths: { hello: 'hello' }, shims: { hello: { exports: 'hello' } } });
baseUrl用于配置js文件的根目录
baseUrl: '/public/js',
paths用于配置js模块的模块名和文件位置
paths: { "jquery": "./lib/jquery.min" }
上面表示jquery的js文件位置为public/js/lib/jquery.min.js
shims、exports、deps配置
shim:{ "modernizr": { //不支持AMD的模块 depts:["jquery"], //依赖的模块 exports: "Modernizr",//全局变量做为模块对象 init : function($){ return $; //初始化函数,返回的对象代替exports做为模块对象 } }, "bootstrap": ["jquery"] //只配置依赖能够省略 }
项目开发初期使用jquery1.12.3,后期觉得须要支持移动开发,升级到jquery2.2.3。可是又担忧以前依赖jquery1.12.3的代码升级到2.2.3后可能会有问题,就保守的让这部分代码继续使用1.12.3版本
map: { "app/api":{ "jquery": "./lib/jquery" }, "app/api2":{ "jquery": "./lib/jquery2" } }
当app/api模块里加载jquery模块时,将加载jquery.js
当app/api2模块里加载jquery模块时,将加载jquery2.js
下载js等待的时间,默认7秒。若是设为0,则禁用等待超时。
下载文件时,在url后面增长额外的query参数
e.g. urlArgs: “_=" + (new Date()).getTime()
是json的一种使用模式,能够跨域获取数据,如json
同源策略:www.baidu.com经过ajax不能获取www.qq.com的数据
//www.qq.com中 <script src="http://www.baidu.com/user?callback=onloaded"></script> //在www.baidu.com/user下 onload({ username: "yoojoo", email: "yookoo@163.com", gender: "男" })
这样经过<script>标签就实现了跨域请求
requirejs也是经过<script>标签来加载模块
//www.qq.com中 require(["http://www.baidu.com/user],function(){ }); //在www.baidu.com中 define({ username: "yoojoo", email: "yookoo@163.com", gender: "男" });
使用text插件加载html
text插件Github
引入text插件
paths:{ "text": "./lib/require/text" }
使用text插件
require(["text!/user.html"],function(template){ $("#userinfo").html(template); });
//!strip表示只加载body内的数据 require(["text!/user.html!strip"],function(template){ $("#userinfo").html(template); });
css插件的Github地址
引入css插件
//方法一:经过map引入 map { "*" { "css": "./lib/require/css" } } //方法二:在paths中引入 paths: { "css": "./lib/require/css" }
使用css插件
//方法一:在require中引用 require(["jquery","bootstrap",""css!./lib/bootstrap/bootstrap.min.css""],function($){ }); //方法二:在slim中配置依赖后,在require中引用时能够省略css shim: { "bootstrap" : ["jquery","css!./lib/bootstrap/bootstrap.min.css"] }
r.js –o baseUrl=js name=app out=built.js
node r.js –o baseUrl=js name=app out=built.js
node r.js -o app.build.js
//app.build.js ({ appDir : "./src", //须要打包的根目录 baseUrl: "./js", //js文件在baseUrl目录下 dir: "./build", //打包后的输出目录 mainConfigFile: "src/js/require.config.js" ,//requirejs的配置文件 name: "app" //打包和输出的文件 })
modules 配置
数组:列出全部须要打包的模块,当打包一个模块时,默认会打包全部依赖的模块
inlineText配置项:是否把文本文件一块儿打包进模块
css打包插件
经过css-builder.js和normalize.js把css文件和模块一块儿打包
"script": { "package": "node r.js -o app.build.js" }
npm run package
使用maven+npm自动打包
maven插件
npm打包缺点:手动打包会有出错的地方,好比开发人员忘了执行打包命令,就提交代码,服务器端在自动部署代码的时候,打包的jar就不包含最新的js和css,这时候就用到了咱们的maven插件frontend-maven-plugin
能够再打包java文件以前自动打包js文件
<plugin> <groupId>com.github.eirslett</groupId> <artifactId>frontend-maven-plugin</artifactId> <version>1.0</version> <executions> <!--下载安装node--> <execution> <id>install node and npm</id> <goals> <goal>install-node-and-npm</goal> </goals> <configuration> <nodeVersion>v4.4.3</nodeVersion> <npmVersion>3.8.6</npmVersion> </configuration> </execution> <!--执行npm命令--> <execution> <id>npm run package</id> <goals> <goal>npm</goal> </goals> <configuration> <arguments>run package</arguments> </configuration> </execution> </executions> </plugin>
执行流程