zoukankan      html  css  js  c++  java
  • requirejs 多页面,多js 打包代码,requirejs多对多打包

    这段代码来自

    http://stackoverflow.com/questions/20583812/grunt-requirejs-optimizer-for-a-multi-app-project

    一般情况下,大部分项目都是多页面很少有项目是单页面应用程序

    而 r.js 默认打包支持两种情况

    1 所有js文件打包到1个文件

    2 在1的基础上可以给js按照模块分组,支持多个模块在1个js文件中

      BUT 都是最终归结为1个js文件。。。。。。

    但是这不是我想要的,我就想要一个页面相关的js打包成一个js文件包,每个页面都有自己的js文件包

    方法很简单 基于grunt+grunt-contrib-requirejs

    具体配置在这里https://github.com/qqqzhch/webfans/blob/master/Gruntfile.js

    module.exports = function(grunt) {
        // r.js 打包 准备
        var files = grunt.file.expand('js/app/*/main.js'); //读取要打包的js入口 一般都为 main的js
        var requirejsOptions = {}; //用来存储 打包配置的对象
        //遍历文件
        files.forEach(function(file) {
            var filenamelist = file.split('/');
            var num = filenamelist.length;
            var filename = filenamelist[num - 2]; //获取目录名称,因为这里的文件名都是main的js
            requirejsOptions[filename] = {
                options: {
                    baseUrl: "js/",
                    paths: {
                        "text": 'lib/text',
                        "jquery": 'lib/jquery',
                        "backbone": 'lib/backbone',
                        "underscore": 'lib/underscore',
                        "Highcharts": 'lib/highcharts/highcharts',
                        "select2": 'lib/select2/select2',
                        "moment": 'lib/moment',
                        "jquery-ui": 'lib/jquery-ui/jquery-ui',
                        "jquery.cookie": 'lib/jquery.cookie',
                        "validate": 'lib/jquery.validate',
                        "metadata": 'lib/jquery.metadata',
                        "jsplumb": "lib/jquery.jsPlumb",
                        "qtip": 'lib/qtip/jquery.qtip',
                        "nicescroll": "lib/jquery.nicescroll",
                        "Htheme": 'lib/highcharts/theme',
                        'jquery.mousewheel': 'lib/jquery.mousewheel'
                    },
                    optimizeAllPluginResources: true,
                    name: 'app/' + filename + '/main',
                    out: 'js/appbuild/' + filename + '/main.js'
                }
            };
        });
        //
    
    
        grunt.initConfig({
    
            pkg: grunt.file.readJSON('package.json'),
            // requirejs: requirejsOptions
            connect: {
                //这里为插件子刷新方式
                options: {
                    port: 9000,
                    hostname: 'localhost', //默认就是这个值,可配置为本机某个 IP,localhost 或域名
                    livereload: 35729 //声明给 watch 监听的端口
                },
                server: {
                    options: {
                        open: true, //自动打开网页 http://
                        base: [
                            '.' //主目录
                        ]
                    }
                }
    
            },
            watch: {
                sass: {
                    files: ['sass/**/*.{scss,sass}', 'sass/_partials/**/*.{scss,sass}'],
                    tasks: ['compass:dist']
                },
                livereload: {
                    options: {
                        livereload: '<%=connect.options.livereload%>' //监听前面声明的端口  35729
                    },
                    files: [ //下面文件的改变就会实时刷新网页
                        'app/*.html',
                        'stylesheets/{,*/}*.css',
                        'javascripts/{,*/}*.js',
                        'images/{,*/}*.{png,jpg}'
    
                    ]
                }
            },
    
            compass: {
                dist: {
                    options: {
                        config: 'config.rb'
                    }
                }
            },
            jst: {
    
                options: {
                    amd: true, // define()的方法包裹生成的内容
                    namespace: false,
                    // prettify: true, // 生成的内容在一行
                    templateSettings: {
                        evaluate: /{%([sS]+?)%}/g,
                        interpolate: /{{([sS]+?)}}/g,
                        escape: /{%-([sS]+?)%}/g
                    }
                },
                // files: {
                //     src: 'js/app/*/tpl/*.html',
                //     dest: 'js/app/$1/tpljs/$2.js'
                // }
                files: {
                    expand: true, // 开启构建动态文件对象
                    cwd: 'js/app/', // 模板目录(源文件)
                    src: ['**/*.html'], // 能匹配到模板的二级目录
                    dest: 'js/app/', // 目标文件目录
                    rename: function(dest, src) {
                        var path = require('path');
                        var filename = path.basename(src);
                        var dirname = path.dirname(src);
                        dirname = dirname.replace('tpl', 'tpljs')
                        var finalPath = path.resolve(dest, dirname, 'js', filename);
    
                        console.log(dirname);
                        console.log(finalPath);
                        return finalPath;
                    },
                    ext: '.js' // 目标文件的后缀名
                }
    
    
            },
            jshint: {
                options: {
                    curly: true,
                    eqeqeq: false,
                    eqnull: true,
                    browser: true,
                    es3: true,
                    latedef: true,
                    newcap: true,
                    noarg: true,
                    noempty: true,
                    //quotmark: true,
                    undef: true,
                    strict: true,
                    maxdepth: 3,
                    maxstatements: 50,
                    maxlen: 255,
                    globals: {
                        jQuery: true,
                        $: true,
                        require: true,
                        define: true,
                        Blueware: true,
                        _: true,
                        Backbone: true,
                        ATM: true,
                        console: true,
                    },
                },
                files: {
                    expand: true, // 开启构建动态文件对象
                    cwd: 'js/app/', // 模板目录(源文件)
                    src: ['*/*.js'], // 能匹配到模板的二级目录
    
                }
            }
    
    
        });
    
    
        grunt.loadNpmTasks('grunt-contrib-compass');
        grunt.loadNpmTasks('grunt-contrib-watch');
        grunt.loadNpmTasks('grunt-contrib-connect');
        grunt.registerTask('default', ['compass:dist', 'connect:server', 'watch']);
    };

    通过观察我们可以发现,配置和r.js 的build.js 是一致的,然后按照文件名存贮到对象中,

    对与和grunt的配置则简单多了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //*****省略其他代码
            requirejs: requirejsOptions
     
     
        });
        // Default task(s).
        grunt.registerTask('dev', [
            'compass:force',
            'connect:server',
            'watch'
        ]);
        grunt.registerTask('dist', [
            'compass:force'
        ]);
        grunt.registerTask('js', ['requirejs']);

    运行结果如下

    image

    观察每个打包后的js文件,发现根据依赖打包,果然强悍,做到了每个页面js的插件数量刚好满足这个页面的需求,做到每个页面的代码都是最少的,可见多对多打包还是挺不错的

  • 相关阅读:
    Ubuntu深度学习环境搭建 tensorflow+pytorch
    FineReport调用存储过程
    简单实现固定表格的上表头、左表头
    为什么vertical-align不起作用
    纪录我的iOS学习之路
    【原】使用Bmob作为iOS后台开发心得——云端代码添加其他User的Relation关系
    【原】使用Bmob作为iOS后台开发心得——查询关联关系(BmobRelation)
    【译】Unity3D Shader 新手教程(6/6) —— 更好的卡通Shader
    【译】Unity3D Shader 新手教程(5/6) —— Bumped Diffuse Shader
    【译】Unity3D Shader 新手教程(4/6) —— 卡通shader(入门版)
  • 原文地址:https://www.cnblogs.com/catgatp/p/9788439.html
Copyright © 2011-2022 走看看