`

grunt-kmc

阅读更多

https://github.com/daxingplay/grunt-kmc/blob/master/README.md

 

KISSY Module Compiler的Grunt插件版本。

KISSY Module Compiler(kmc)是一个基于NodeJS的KISSY模块打包工具,目前适用于KISSY 1.2+的代码打包

如果您有任何问题,请提issue,或者邮件,或者来往(daxingplay)上联系我,阿里巴巴厂内用户还可以联系紫英。

项目说明

依赖Grunt ~0.4.1,请首先安装Grunt,参照Grunt安装手册Gruntfile样例。之后,敲入命令来安装grunt-kmc:

npm install grunt-kmc --save-dev

然后,确保你的gruntfile.js中载入了这个模块

grunt.loadNpmTasks('grunt-kmc');

视频演示

构建规则说明:基于 KISSY 的项目代码只要符合 KMD 规范,在源码发布上线之前,要做至少两件事

  1. 线上模块代码必须带有模块名配置
  2. 静态合并或者生成依赖关系的Map

Gruntfile.js 里的 KMC 任务

介绍

在Gruntfile.js文件中,添加名为kmc的任务,代码块写在grunt.initConfig()函数参数对象中

grunt.initConfig({
    kmc: {
        options: {
            depFilePath: 'build/mods.js',
            comboOnly: true,
            fixModuleName:true,
            comboMap: true,
            packages: [
                {
                    name: 'package-name',
                    path: './src/',
                    charset:'utf-8',
                    ignorePackageNameInUri:true

                }
            ],
        },
        main: {
            files: [
                {
                    expand: true,
                    cwd: 'src/',
                    src: [ '**/*' ],
                    dest: 'build/'
                }
            ]
        }
    },
})

配置项

options.packages

  • 类型: Array
  • 默认值: []

KISSY 包配置项,可以使用KISSY 1.2的数组方式,也可以使用KISSY 1.3+的对象方式。配置项的含义和KISSY的包配置规则完全一致,具体可参考KISSY loader的文档。比如:

packages: [
    {
        name: 'package-name',
        path: './src/',
        charset:'utf-8',
        ignorePackageNameInUri:true
    }
]

或者(推荐)

packages: {
    'package-name': {
        base: './src/',
        charset:'utf-8',
        ignorePackageNameInUri:true
    }
}

options.charset

  • 类型: String
  • 默认值: utf-8

输入文件的编码

options.comboOnly

  • 类型: Boolean
  • 默认值: false

设置为true时,将不进行文件静态合并,比如两个文件a.jsb.js

a.js

// a.js
KISSY.add(function(S){
    // a
},{
    requires:['./b']
});

b.js

// b.js
KISSY.add(function(S){
    // b
});

comboOnlyfalse时将静态合并,比如a.js将生成为:

a.js

// b.js
KISSY.add('pkg/b',function(S){
    // b
});
// a.js
KISSY.add('pkg/a',function(S){
    // a
},{
    requires:['./b']
});

即所有的依赖也都合并到一个文件中。

options.cleanUp

  • 类型: Boolean
  • 默认值: false

comboOnlyfalse(静态合并)时,是否将没有指定合并的文件都删除,以减少构建后无用文件数量,cleanUp 为 true 时清除,为false时不清除

comboOnlytrue时此配置项不起作用

options.depFilePath

  • 类型: String
  • 默认值: ``

生成依赖关系表的文件(输出)位置

options.depFileCharset

  • 类型: String
  • 默认值: 和options.charset保持一样

依赖关系表文件的编码类型

options.traverse

  • 类型:Boolean
  • 默认值:false

当指定模个文件为入口文件时,遍历子目录进行构建

options.fixModuleName

  • 类型:Boolean
  • 默认值:false

置为true时,会给所有文件补全模块名,建议当comboOnlytrue时,总是设置此项为true 重要:fixModuleName会在指定的src上进行补全模块名,所以如果您需要使用combo模式并且需要补全模块名,请先用grunt-contrib-copy将您的src文件拷贝到dest,然后再对dest执行kmc任务。

options.comboMap

  • 类型:Boolean
  • 默认值:false

当指定一批文件为源文件时,对这些文件只生成模块依赖关系表,存放于options.depFilePath

options.copyAssets

  • 类型:Boolean
  • 默认值:false

需要和fixModuleName搭配使用。 选项为true的时候,kmc会把src的文件拷贝到dest后再添加模块名。为false的时候,会直接在用户配置的src中的文件添加模块名。我们建议您如果有fixModuleName的需求的时候,先使用grunt-contrib-copy任务把src拷贝到dest,再执行grunt-kmc任务


用法

Example1

如果静态合并:其中mods中的文件被index.jslist.js所依赖,Example

Before After
./src
├── mods
│   ├── a.js
│   ├── b.js
│   ├── c.js
│   └── d.js
└── pages
    └── home
        ├── index.js
        └── list.js
sample/build
└── pages
    └── home
        ├── index.js
        └── list.js

Example2

生成Map:Example

Before After
./src
├── mods
│   ├── a.js
│   ├── b.js
│   ├── c.js
│   └── d.js
└── pages
    └── home
        ├── index.js
        └── list.js
./build
├── mods
│   ├── a.js
│   ├── b.js
│   ├── c.js
│   └── d.js
├── map.js
└── pages
    └── home
        ├── index.js
        └── list.js

Example3

仅补全模块名:Example


更多配置写法参考

示例1,单文件静态合并

入口为单个文件,将这个文件的依赖关系解析好后合并入另一个文件

grunt.initConfig({
    kmc: {
        main:{
            options: {
                packages: [
                    {
                        name: 'test',
                        path: 'assets/src',
                        charset: 'utf-8',
                        ignorePackageNameInUri:true
                    }
                ]
            },
            files: [{
                // 入口和出口均为单文件
                src: 'assets/src/test/index.js',
                dest: 'assets/dist/test/index.combo.js'
            }]
        }
    }
});

详细配置项请参照kmc首页

如果输出gbk编码的文件,需要配置全局项

kmc: {
    options: {
        charset:'gbk',
        packages: [
            {
                name: 'pkg-name',
                path: '../',
                charset:'gbk',
                ignorePackageNameInUri:true
            }
        ]
    },
//...
grunt.file.defaultEncoding = 'gbk';

示例2,批量静态合并文件

入口为一批文件,每个文件都解析合并

grunt.initConfig({
    kmc: {
        options: {
            packages: [
                {
                    name: 'pkg-name',
                    path: '../',
                    charset:'utf-8',
                    ignorePackageNameInUri:true

                }
            ],
            // 将 ModuleName 中的 `src` 去掉
            map: [['pkg-name/src/', 'pkg-name/']]
        },

        main: {
            files: [
                {
                    // 这里指定项目根目录下所有文件为入口文件
                    expand: true,
                    cwd: 'src/',
                    src: [ '**/*.js', '!Gruntfile.js'],
                    dest: 'build/'
                }
            ]
        }
    }
});

示例3,批量静态合并,包名为变量

入口为一批文件,每个文件都解析合并,包名从配置文件中读取

grunt.initConfig({
    // 读取`abc.json配置文件中的配置`
    pkg: grunt.file.readJSON('abc.json'),
    kmc: {
        options: {
            packages: [
                {
                    name: '<%= pkg.name %>',
                    path: '../',
                    charset:'utf-8',
                    ignorePackageNameInUri:true
                }
            ],
            // 将 ModuleName 中的 `src` 去掉
            map: [['<%= pkg.name %>/src/', '<%= pkg.name %>/']]
        },

        main: {
            files: [
                {
                    // 这里指定项目根目录下所有文件为入口文件
                    expand: true,
                    cwd: 'src/',
                    src: [ '**/*.js', '!Gruntfile.js'],
                    dest: 'build/'
                }
            ]
        }
    }
});

其中 abc.json 文件内容如下:

{
    "name": "my-custom-package-name",
}

示例4,针对一批文件生成依赖关系表

生成模块依赖关系表,同时源文件也被添加好模块名存放到目标目录

grunt.initConfig({
    options: {
        packages: [
            {
                name: 'h5-test',
                path: './src/', //指定package起始路径
                charset:'utf-8',
                ignorePackageNameInUri:true
            }
        ],
        // 生成模块依赖关系表
        depFilePath:'build/mods.js',
        comboOnly:true,// 不要静态合并
        fixModuleName:true,// 补全模块名称
        comboMap:true
    },
    main: {
        files: [
            {
                src: 'src/**/*.js',
                dest: 'build/'
            }
        ]
    }
});

更多应用案例

Clam工具和阿里内部工具ABC依赖kmc。


Q & A

生成的Map文件依赖地址怎么有绝对地址?

比如

/*generated by KMC*/
KISSY.config('modules', {
 'xcake/app/cjs-full': { requires: ['node', '/home/bachi/xx/node-kpc/sample/src/components/header/index.js']},
 'xcake/app/cjs': { requires: ['node', '/home/bachi/xx/node-kpc/sample/src/components/header/index.js']},
 'xcake/app/fac-config': { requires: ['node']},
 'xcake/app/namedMod2': { requires: ['node', '/home/bachi/xx/node-kpc/sample/src/app/mod.js']} 
});

原因是header/index.js文件不存在。

分享到:
评论

相关推荐

    grunt-cli压缩包-0.1.13版本

    `grunt-cli`是Grunt(一个JavaScript任务运行器)的命令行接口,它允许开发者在命令行中执行Grunt任务。这个压缩包包含了`grunt-cli`的0.1.13版本,这是一个早期但仍然被一些项目依赖的版本。在这个版本中,除了`...

    grunt-cli模块

    这将把grunt-cli安装到你的全局Node.js模块路径下,通常位于`C:\Users\Administrator\AppData\Roaming\npm\node_modules\grunt-cli`(Windows系统)或`/usr/local/lib/node_modules`(Unix/Linux系统)。全局安装...

    grunt-cli是grunt的客户端,现提供的是基于redhat7.0_x64的客户端

    **Grunt 和 Grunt-CLI 简介** Grunt 是一个JavaScript任务运行器,它在前端开发领域广泛用于自动化工作流程,如编译、压缩、测试等。它通过配置文件(Gruntfile.js)来定义一系列的任务,使得开发者能够高效地管理...

    前端开源库-grunt-cmd-transport-wnd

    `grunt-cmd-transport-wnd` 是一个专门用于前端构建的开源库,它基于 Grunt,一个强大的JavaScript任务运行器,旨在帮助开发者自动化执行各种重复性工作,如编译、测试、清理和部署等。`grunt-cmd-transport-wnd` 的...

    前端开源库-grunt-transport-pas

    **grunt-transport-pas** 是一个前端开发工具,它基于 **Grunt**,这是一个流行的JavaScript任务运行器。Grunt提供了一种自动化的方式来执行常见的前端开发任务,如编译、压缩、测试等。在本例中,`grunt-transport-...

    px、rem转换工具 grunt-px2rem-master

    `grunt-px2rem`是一个Grunt插件,专门用于批量处理CSS文件,将其中的px单位转换为rem,以适应移动优先的布局策略。`grunt-px2rem-master`则是这个插件的主分支或最新版本的压缩包。 **一、px与rem单位** 1. **px...

    grunt-electron-installer, 为电子应用构建 Windows 安装程序的插件插件.zip

    grunt-electron-installer, 为电子应用构建 Windows 安装程序的插件插件 电子安装程序Grunt插件 Grunt插件,为电子应用程序构建 Windows 安装程序,使用 Squirrel 。安装npm install --save-dev grunt-electron-...

    前端开源库-grunt-filerev

    3. 安装`grunt-filerev`:在`Gruntfile.js`所在目录下运行`npm install grunt-filerev --save-dev`,将`grunt-filerev`作为开发依赖添加到`package.json`。 4. 配置`grunt-filerev`:在`Gruntfile.js`中配置`...

    前端开源库-grunt-typescript

    要在项目中使用grunt-typescript,首先需要安装Grunt和grunt-cli,然后通过npm(Node.js包管理器)安装grunt-typescript插件。基本步骤如下: 1. 初始化Grunt项目: ``` npm init -y npm install --save-dev ...

    前端开源库-grunt-pulses

    **前端开源库-grunt-pulses** `grunt-pulses` 是一个专门为前端开发者设计的开源库,主要用于自动化构建过程。在前端开发中,构建工具是非常重要的一环,它们可以帮助我们简化项目构建、打包、压缩和优化等工作,...

    grunt-node离线包.zip

    《grunt-node离线包详解与应用实践》 在IT行业中,构建工具的使用至关重要,它们能够自动化执行项目中的各种任务,提高开发效率。本篇文章将详细介绍`grunt-node`离线包,以及如何在项目中有效地使用它。`grunt-...

    grunt-contact 模块

    `grunt-contact`模块是Grunt工作流中的一个插件,用于简化前端开发过程中的任务自动化。Grunt是一款基于JavaScript的任务运行器,它可以帮助开发者执行预处理、编译、压缩、测试等一系列构建任务。在这个场景中,`...

    前端开源库-grunt-clientlibs

    `grunt-clientlibs`就是一个这样的工具,它基于Grunt,一个流行的JavaScript任务运行器,用于自动化前端开发过程中的各种任务。这个库的目的是帮助开发者自动生成客户端库,主要针对JavaScript和CSS的文档生成。 ...

    前端开源库-grunt-contrib-testem

    **前端开源库-grunt-contrib-testem** 在前端开发中,自动化测试是确保代码质量与项目稳定性的关键步骤。`grunt-contrib-testem` 是一个非常有用的工具,它将测试框架Testem与Grunt任务运行器集成在一起,使得前端...

    前端开源库-grunt-inline-angular-templates

    使用`grunt-inline-angular-templates` 首先需要安装Grunt和该插件。在项目根目录下,通过npm(Node.js的包管理器)执行以下命令: ```bash npm install --save-dev grunt grunt-inline-angular-templates ``` ...

    前端开源库-grunt-webfont

    要使用grunt-webfont,首先需要在项目中安装Node.js环境,然后通过npm(Node包管理器)安装Grunt和grunt-webfont插件。在项目根目录下创建一个`Gruntfile.js`配置文件,定义grunt-webfont的任务。在配置文件中,你...

    grunt-contrib-copy, 复制文件和文件夹.zip

    grunt-contrib-copy, 复制文件和文件夹 grunt-contrib-copy-v1.0.0 复制文件和文件夹正在启动If之前,请务必先查看一下如何创建 Gruntfile插件,以及安装和使用Grunt插件。 熟悉该过程后,你可以使用以下命令安装...

    前端开源库-grunt-obfuscator-node

    前端开源库-grunt-obfuscator-node咕哝模糊节点,模糊节点通过咕哝项目

    grunt-babel依赖模块

    使用grunt-babel 转换es6 到es5依赖库

    前端开源库-grunt-es6-transpiler

    `grunt-es6-transpiler`正是这样一个工具,它是基于Grunt的任务插件,用于将ES6语法编译为ES5,确保代码能在各种环境下正常运行。 Grunt是JavaScript任务运行器,它允许开发者定义和运行自动化任务,如代码编译、...

Global site tag (gtag.js) - Google Analytics