stay hungry stay foolish

gruntjs结合seajs开发

gruntjs是一款前端构建化工具,其可以帮我们做很多重复性的劳动,可以很大程度上提高前端开发的效率,下面用实例就来简单介绍下其配合seajs模块化框架是如何使用的。

示例

1.首先你得安装nodejs,然后新建nodejs文件夹,当作项目的根目录,在其中新建package.json

package.json:

{  
  "name":"testGrunt",  
  "version":"0.1.0",  
  "dependencies": {  
    "grunt":"~1.0.1",  
    "grunt-cmd-concat":"~0.2.1",  
    "grunt-contrib-uglify":"~2.0.0",  
    "grunt-cmd-transport":"~0.5.1",  
    "grunt-mcopy":"~0.4.3",  
    "grunt-contrib-clean":"~0.6.0"  
  }  
}  

2.打开命令行,进入nodejs目录,运行以下命令安装所有的依赖

npm install  

此时将在nodejs目录下生成一个文件夹node_modules,里面包含了我们需要用的所有依赖

3.在nodejs目录下新建我们的测试页面

sea.html:

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>Document</title>  
    <script type="text/javascript" src="sea.js"></script>  
    <script type="text/javascript">  
        seajs.use("main",function(){  
            console.log("执行入口模块回调函数");  
        })  
    </script>  
</head>  
<body>  
</body>  
</html> 

注意:main为合并后的文件,,与sea.html同目录,该文件中的每个模块都必须要有id才能项目依赖,并且其入口模块的id必须为main

4.在nodejs目录下新建目录,用来存放项目的js模块,并且在该目录下新建main.js,a.js,test.js

main.js:

define(function(require,exports,module){  
    require("test.js");  
    console.log("执行main.js");  
});  
test.js
[javascript] view plain copy
define(function(require,exports,module){  
    require("a.js");  
    console.log("执行test.js");  
})  

a.js:

[javascript] view plain copy
define(function(require,exports,module){  
    console.log("执行a.js");  
})  

5.把seajs框架文件sea.js拷贝到nodejs目录下,在nodejs目录下新建我们的grunt任务配置文件Gruntfile.js

Gruntfile.js:

module.exports = function(grunt) {  
  
  // Project configuration.  
  grunt.initConfig({  
    pkg: grunt.file.readJSON('package.json'),  
    transport: {  
        target_1: {  
            files: [{  
                expand:true,  
                cwd: 'sea_modules',  
                src: '*.js',  
                dest: 'dist'  
            }]  
        }  
    },  
    concat: {  
        target_1: {  
            options: {  
                noncmd: true  
            },  
            files: {  
                'dist/main.js': ['dist/main.js','dist/test.js','dist/a.js']  
            }  
        }  
    },  
    uglify: {  
        target_1: {  
            files: {  
                'dist/main.js': ['dist/main.js']  
            }  
        }  
    },  
    copy : {  
        target_1 : {  
            files:[  
            {expand: true, cwd:'dist',src:'main.js', dest:'.', filter: 'isFile'}  
            ]  
        }  
    },  
    clean: {  
        build: {  
            src: ["dist"]  
        }  
    }  
  });  

  // 加载包含 "uglify" 任务的插件。  
  grunt.loadNpmTasks('grunt-cmd-transport');//提取js模块的id和依赖  
  grunt.loadNpmTasks('grunt-cmd-concat');//合并js模块  
  grunt.loadNpmTasks('grunt-contrib-uglify');//压缩js模块  
  grunt.loadNpmTasks('grunt-mcopy');//复制文件  
  grunt.loadNpmTasks('grunt-contrib-clean');//清空文件夹  
  
  // 默认被执行的任务列表。  
  grunt.registerTask('default', ['transport','concat','uglify','copy','clean']);  
  
};  

6.打开命令行,进入nodejs目录,运行grunt命令

此时将会在nodejs目录下生成合并后的main.js,该文件即我们最终需要的文件

main.js:

define("main",["test"],function(a,b,c){a("test.js"),console.log("执行main.js")}),define("test",["a"],function(a,b,c){a("a.js"),console.log("执行test.js")}),define("a",[],function(a,b,c){console.log("执行a.js")});  

如果只运行transport任务:

grunt.registerTask('default', ['transport'/*,'concat','uglify','copy','clean'*/]);  

则将只提取js模块的id和依赖

提取后的文件:

main.js:

define("main", [ "test" ], function(require, exports, module) {  
    require("test.js");  
    console.log("执行main.js");  
});  

test.js:

define("test", [ "a" ], function(require, exports, module) {  
    require("a.js");  
    console.log("执行test.js");  
}); 

a.js:

define("a", [], function(require, exports, module) {  
    console.log("执行a.js");  
});  

7.运行sea.html进行测试,结果如下:

可以看到,成功合并了文件。