requirejs_打包

假设模块a,b,b2,c,d,e,f依赖如:

a    b    b2
\    /|    |
  c    |     |
/    \|    |
d     e\    |
        f

即:

  • 模块c依赖a,b
  • 模块d依赖c
  • 模块e依赖c,b
  • 模块f依赖c,b2
/**
1. Gruntfile.js就是个Node模块
2. grunt plugin: commonly used task service as plugin
3. Task & Target
4. 异步task ?
5. 配置

不能做什么

  1. The optimizer cannot load network resources

Task执行函数

  1. return false
    */
    var requirejs = require('requirejs');
    var path = require('path');

// Wrap function
module.exports = function(grunt) {
/**

  1. Project configuration,ConfigData
  2. Task configuration取ConfigData中跟task同名的属性
    */
grunt.initConfig({

});

grunt.registerTask('demo1',function() {
    var r,w;
    var done = this.async();        
    var config = {
        appDir: '../src',baseUrl: './scripts',optimize: 'none',// 不使用uglifyJs处理
        dir: '../dest',mainConfigFile: '../mainConfigFile.js',/**
        * dirOptimize方式不会进行模块依赖解析。这个跟modules方式指定的优化方式不一样。
        */
        //skipDirOptimize: true,/**
        * 背景:模块解析过程大致是:
            1. 读取模块文件内容,
            2. 然后根据内容(字符串)解析该模块依赖,并依次递归的方式解析各个依赖(即重复步骤1,2,3)
            3. 把模块的所有依赖优化处理并写入bundle
            4. 优化模块本身并写入bundle

        * 读取模块文件时会调用该回调函数。即上述步骤1执行完且步骤2执行前调用。可以动态修改内容。
        * 所有进行优化的模块都会调用
        */
        onBuildRead: function (moduleName,path,contents) {

            console.log('onBuildRead--->' + moduleName)
            // if(!r) {
            //     r= true;
            //     //contents =  contents.replace(/a/,'b');
            //     console.log(contents)
            // }
            return contents;
        },/**

        所有进行优化的模块都会调用
        */
        onBuildWrite: function (moduleName,contents) {
            grunt.log.ok('onBuildWrite--->' + moduleName)
            // if(!w) {
            //     w= true;
            //     console.log(contents)
            // }
            return contents;
        },onModuleBundleComplete: function(data) {
            console.log('onModuleBundleComplete--->' + data.name + '\n')
        },/**
         指定进行优化处理(optinized)的模块。每个指定的元素都是生成一个bundle。该bundle包含指定的模块,以及该模块的依赖和依赖的依赖
        */
        modules: [
        {
            name: 'c',//exclude: ['a']
        },// {
        //     name: 'e',//     场景1:模块c和其依赖都不打入bundle。 e bundle里只有模块e,虽然模块b也是模块e的直接依赖,但也是模块c的依赖故也被排除了。
        //             原因:模块e依赖c,a,b。排除的依赖:c,b
        //     场景2:模块c也配置了exclude: ['a'],则模块c和其依赖b不打入bundle,但模块a会打入bundle.
        //             原因:模块e依赖c,b。模块a被模块c排除了,所以对于模块e不记为被排除,负负得正。
        //     场景3:模块e没有配置exclude,则模块c和其依赖都打入bundle,不管模块c是否配置exclude。

        //     一句话:最终的bundle = name模块(如果有) + 模块的所有依赖  - exclude指定模块和模块的依赖

        //     //exclude: ['c'] 
        // },// {
        //     name: 'd'
        // },// {
        //     name: 'f'
        // }
        ],}

    console.log(JSON.stringify(requirejs))
    requirejs.optimize(config,function (buildResponse) {  
        done();
    },function(err) {
        grunt.log.error(err)
    });
});

// r.js
grunt.registerTask('requirejs',function () {
    var done = this.async();

    var config = {
        appDir: '../src',//name: 'main',// 不使用uglifyJs处理
        //out: './build/main-build.js',paths: {
            onlineSrc: 'empty:',text: path.join(__dirname,'text')
        },//include: ['four'],//excludeShallow: ['two']
        /* 多文件输出 */
        //skipDirOptimize: true,// 如果optimize: 'none',那这个配置也没意义了。
        dir: '../dest/multi',stubModules: ['text'],//A function that if defined will be called for every file read in the
        //build that is done to trace JS dependencies. This allows transforms of
        //the content.
        onBuildRead: function (moduleName,contents) {
            console.log('onBuildRead--->' + moduleName)
            //Always return a value.
            //This is just a contrived example.
            return contents.replace(/foo/g,'bar');
        },onBuildWrite: function (moduleName,contents) {
            // text模块已存在框架里面
            if (moduleName == 'text') {
                return '';
            }
            return contents;
        },modules: [{
            name: 'main',exclude: ['one','two']
        }],optimizeCss: false,//inlineText: false,onModuleBundleComplete: function(data) {
            console.log('\n************************')
            console.log(data)
        }

    }

    // function parseModuleName(contents) {
    //     var matchs,//         moduleNames = [],//         regExp = /define\(\'([^']+)/gm;
    //     while((matchs = regExp.exec(contents)) !== null) {
    //         moduleNames.push(matchs[1]);
    //     }
    //     return moduleNames;
    // }

    requirejs.optimize(config,function(err) {
        grunt.log.error(err)
    });

});

}

参考

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340