cmd合并打包、存在的坑、解决方案及注意事项

我想要的打包目标是:将模块合并,同时实现只需要简单修改的配置就能在发布版和调试版之间切换。

我的CMD模块文件

src/modules/module-1.js

src/modules/module-2.js

//src/modules/module-all.js

src/modules/startup.js

我想要的目标文件是

dist/modules/module-all.js

dist/modules/startup.js

首页文件 index.html

<script type="text/javascript">
    seajs.config({
        base: "/scripts/",
        //paths: {
        //    "modules": "dist/modules",
        //},
        map: [[".js", ".js?v=" + 123]],//这样子更新版本号就很方便了
    });
    console.log("startup");
    seajs.use([‘modules/startup‘], function (s) {s.show() });//‘zepto‘,‘spa‘,

</script>

当我们想切换成发布版时只需要把paths注释去掉就可以了。

//切换成发布版
<script type="text/javascript">
    seajs.config({
        base: ""/scripts/")",
        paths: {
            "modules": "dist/modules",
        },
        map: [[".js", ".js?v=" + 123]],//这样子更新版本号就很方便了
    });
    console.log("startup");
    seajs.use([‘modules/startup‘], function (s) {s.show() });//‘zepto‘,‘spa‘,

</script>

各js文件

//src/modules/module-1.js
define(function (require, exports, module) {
    exports.show = function () {
        console.log("module-1 show");
    }
});

//src/modules/module-2.js
define(function (require, exports, module) {
    exports.show = function () {
        console.log("module-2 show");
    }
});

//src/modules/startup.js
define(function (require, exports, module) {
    exports.show = function () {
        require.async(["./module-2"], function (m1) {
            m1.show();
        });
    }
});

没的说,关于CMD合并打包网上一搜一大把,我是使用grunt-cmd-transport、grunt-cmd-concat进行合并的。以下是合并后的目标文件,以为可以一下子就弄好,结果各种报错,各种郁闷。

//dist/modules/module-all.js
define("dist/modules/module-1", [], function(require, exports, module) {
    exports.show = function() {
        console.log("module-1 show");
    };
});
define("dist/modules/module-2", [], function(require, exports, module) {
    exports.show = function() {
        console.log("module-2 show");
    };
});

//dist/modules/startup.js
define("dist/modules/startup",["./module-2"],function (require, exports, module) {
    exports.show = function () {
        require.async(["./module-2"], function (m1) {
            m1.show();
        });
    }
});

首先,grunt-cmd-transport 5.0有bug,老是把斜杠变(“/”)成双反斜扛”\\”(这是巨坑呀),各种报路径错误,后来Google了一下,发现是要降低版本才可以,最后降到了”v0.4.1”(改一下package.json中的版本号),这个问题修复之后,还是报“找不到 ‘dist/modules/module-2.js’”错误。到这里,想到了一个CMD的规范:一个模块就是一个文件(这也是坑呀)。合并后只有module-all文件当然会报这个错误了。于是把dist/modules/startup.js改成了以下的样子,就是要在加载”./module-2”模块前把”./module-all”加载好,这样他会先在已加载的模块中找,找不到才会从远端下载(我是这样理解的):

//dist/modules/startup.js
define("dist/modules/startup",["./module-all"],function (require, exports, module) {
    exports.show = function () {
        require.async(["./module-2"], function (m1) {
            m1.show();
        });
    }
});

这样子发现可行,但是总不能每次发布后都这样子改吧,于是想到在src/modules/startup.js中加上依赖[‘../module-all’]

//src/modules/startup.js
define(["./module-all"],function (require, exports, module) {
    exports.show = function () {
        require.async(["./module-2"], function (m1) {
            m1.show();
        });
    }
});

加上后发现grunt报错,网上说可以使用grunt –force强制执行,果然,加上后grunt不报错了,源码版也可以运行,但是老是报找不到modules/module-all.js文件,实在不爽。

这时候脑袋一亮,既然他要这个文件,我就给他一个不就得了。所以添加了以下的文件:

//src/modules/module-all.js
define(function(require, exports, module) {
    //定义一个空模块,这样可以避免切换到源码版报找不到module-all.js文件的js错误,合并时记得要把它排除掉
    //require("./module-1");//不能写
});

不报错了,总算完美的解决了。

注意事项:

1、src/modules/module-all.js不能写require(“./module-1”);源码版可能会出问题,在我的测试项目中没有发现这个问题,但是在另一个项目中发现require文件会不执行;

2、concat的时候不要把src/modules/module-all.js合并进去;

3、concat 配置成include: “relative”不是很关键。

4、CMD模块的ID是区分大小写的。

最后的Gruntfile配置如下,先transport再concat

//将cmd文件transport一下,用于后面的cmd打包
transport: {
    options: {
        idleading: ‘dist/‘ /*模块ID前缀*/,
        debug: false,
        //uglify:false
    },
    modules: {
        //options: { idleading: ‘dist/‘ },
        files: [{
            expand: true,//如果设为true,就表示下面文件名的占位符(即*号)都要扩展成具体的文件名。
            src: [‘modules/*.js‘],
            dest: ‘tran‘,
        }],
    },
},
//cmd合拼文件
concat: {
    options: {
        //定义一个用于插入合并输出文件之间的字符
        //separator: ‘;‘,
        //stripBanners: { line: true },
        include: ‘relative‘,
    },
    template: {
        options: {
            noncmd: true //忽略非cmd模块
        },
        files: {
            //不要把transport后的*-all.js文件合并
            ‘dist/modules/module-all.js‘: [‘tran/modules/module-*.js‘,‘!tran/modules/module-all.js‘],
            ‘dist/modules/startup.js‘: [‘tran/modules/startup.js‘]
        }
    },
}

参考文档:

为什么 SeaJS 模块的合并这么麻烦

grunt-cmd-transport

grunt-cmd-concat

时间: 2024-09-30 07:53:49

cmd合并打包、存在的坑、解决方案及注意事项的相关文章

Xcode9.2打包图片显示异常解决方案

Xcode9.2打包图片显示异常解决方案 iOS8.1和8.2系统图片花掉 解决办法: 使用低版本xcode打包, 9.1或者9.0 把图片资源直接放在bundle下,不要放在image assets下. 升级Xcode9.2之后App Icon突然不显示 在Xcode8.x上配置好的App Icon文件,在Xcode8.x的模拟器以及打包安装到真机上App Icon都能正常显示.升级到Xcode9.2之后,查看App Icon中资源文件都正常,但是在模拟器上跑的时候和安装到真机上App Ico

CMD模块打包部署总结

目前线上系统利用Seajs做模板化,但是没有对js和css进行打包,在这次简历搜索优化项目里我尝试对gulp插件对Seajs模块打包. 安装gulp和相关插件 npm install -g gulp npm install --save-dev gulp cmd打包的插件:gulp-cmd gulp-cmd可以解析seajs.config中的alias,vars,paths 只有在有seajs.use的时候才有用 npm install --save-dev gulp-cmd css压缩插件gu

ExtJS(6)- 用Sencha Cmd构建打包Ext项目

用ExtJS组建前端框架有一年多了,考虑到ExtJS中js过多,为提高效率,所以开始寻找打包的方法,然后就发现了这个Sencha Cmd.首先Sencha Cmd不仅仅是为了打包而生的,它同样具有构建前端框架的作用. 以下为所需的环境: Sencha Cmd 下载地址:http://www.sencha.com/products/sencha-cmd/download/Ruby 下载地址:http://rubyinstaller.org/downloads Ant下载地址:http://ant.

AngularJS分别RequireJS做文件合并压缩的那些坑

小心!AngularJS合并RequireJS做文件离开压缩的那些坑 小心!AngularJS合并RequireJS做文件离开压缩的那些坑,各人正在做文件离开压缩的时辰一定要注意,感乐趣的网友可以参考一下正在项目运用了AngularJS框架,用RequireJS做异步模块加载(AMD),正在做文件离开压缩时,遇到了一些坑,有些只是搞定了,但不大白原因. 那些坑1. build.js内里的paths必须跟main.js内里的保持等同. 这个build.js便是r.js运用的设置文件,而main.j

Windows上使用CSS合并打包工具css-combo

首先介绍下css-combo的功能:把CSS模块化的文件,打包合并到一个CSS文件中. 为什么项目中可能需要使用这个工具,作者给出了详细的说明.http://www.techcheng.com/study/css/introduce-css-combo.html ccs-combo的源文件托管地址:https://github.com/daxingplay/css-combo 由于这个是用nodejs做的小工具,所以我们必须安装nodejs和npm模块管理操作扩展. 1. 下载Node.js在W

AngularJS结合RequireJS做文件合并压缩的那些坑

我在项目使用了AngularJS框架,用RequireJS做异步模块加载(AMD),在做文件合并压缩时,遇到了一些坑,有些只是解决了,但不明白原因. 那些坑 1. build.js里面的paths必须跟main.js里面的保持一致. 这个build.js就是r.js使用的配置文件,而main.js就是RequireJS的main文件.在合并压缩时候,build.js文件里面也需要写paths,而且还是跟main.js一样,我很奇怪为什么就不能识别main里面的require.config的pat

安卓项目打包时候报错--解决方案

今天在打包的时候报了一堆同样的错误,是因为引入PulltoRefreshLibrary这个库导致的,只要一打包,就会报八百多个同样的错误,可能是因为在打包的时候,引用库的时候有冲突一类的: 具体解决方案: 第一步:右键安卓项目--->属性 第二步:直接看图 第三步:选择 Ignore All 然后点击Apply 第四步:clean整个安卓项目 第五步:打包-->直至成功.

02 打包生成部署(坑)

坑. 这一章只是草草的看了. 书中大概讲了下 编译 - 发布的过程经历了什么. 编译时调用什么 编译后元数据的组成. 如何给项目添加引用. 如何在没有VS的时候独自完成这些. 我们平时都是用vs 进行打包编译. 究竟做了什么并不清楚 暂时也不需要深入研究. 坑先挖到这里. 需要用到的时候,来看

vue2打包时内存溢出解决方案

vue项目完成时,若项目过大,就会出现内存溢出的问题,导致vue打包不成功 错误截图 解决方案 在依赖package.json中修改build为 "build":"node --max_old_space_size=4096 build/build.js" 截图如下: