GithubHelp home page GithubHelp logo

gallery's Introduction

引入 CMD 模块指南

准备工作

安装 grunt-cli 和 spm2

npm install grunt-cli -g
npm install [email protected] -g -f

Fork cmdjs/gallery 仓库

Fork cmdjs/gallery 到自己的仓库中, 然后把 fork 后的仓库克隆到本地, 如:

git clone [email protected]:{{your_username}}/gallery.git

然后安装依赖模块。

npm install

cmdjs 下的 jquery 仓库, 步骤是和 gallery 类似的.

迁移 CMD 模块

选定某模块

例如 Highcharts 在 github 上的仓库

cd jquery           // or cd 到 gallery
mkdir highcharts    // 以模块名建目录, 小写, 多单词用 '-' 连接
cd highcharts
touch package.json  // 模块元信息
touch Gruntfile.js  // 下载及处理脚本
touch spec.js       // 简单测试用例脚本

编辑 package.json

package.json 各项含义参考 这里, 一般可以复制以下的模板, 替换各值即可.

{
    "family": "jquery",
    "name": "highcharts",
    "version": "3.0.4",
    "title": "Highcharts JS",
    "description": "Highcharts JS is a JavaScript charting library based on SVG and VML rendering.",
    "docs": "http://docs.highcharts.com/",
    "homepage": "http://www.highcharts.com/",
    "demo": "http://www.highcharts.com/demo/",
    "author": {
        "name" : "http://highsoft.com/",
        "url" : "http://highsoft.com/"
    },
    "keywords": [
        "Charts",
        "SVG"
    ],
    "licenses": "www.highcharts.com/license",
    "dependencies": {
        "jquery": "*"
    },
    "repository": {
        "type": "git",
        "url": "git://github.com/highslide-software/highcharts.com.git"
    },
    "spm": {
        "alias": {
            "$": "$"
        },
        "output": [
            "highcharts.js",
            "highcharts-more.js",
            "exporting.js",
            "highstock.js"
        ]
    }
}

注意 有些信息可以直接在模块的原仓库地址中的某些文件中找到, 如: bower.json, *.jquery.json, component.json, 甚至有完整的 package.json, 另外, 需要添加我们特有的 spm 字段. 如果没有依赖 jquery, 则 spm.alias 下的 $ 可以去掉

编写 Gruntfile.js

module.exports = function(grunt) {
  var pkg = grunt.file.readJSON('package.json');

  grunt.initConfig({
    pkg: pkg,

    download: {
      options: {
        dest: 'src'
      },
      highcharts: {
        options: {
          transform: function(code) {
            // 根据需要对下载下来的 js 代码进行修改, 大致有以下几点
            // - 模块已有依赖的库, 如 jquery, 需要统一 require('$')
            // - 如果模块有返回的话, 需要在末尾通过 module.exports 方式返回
            // - 有些模块内部有判断 amd / cmd 的逻辑的话, 则无须包裹 define, 直接采用它的即可, 例如 jquery/jquery
            return [
              'define(function(require, exports, module) {',
              'var previousJQuery = this.jQuery;',
              "this.jQuery = require('$');",
              code,
              "module.exports = window.Highcharts;",
              "this.jQuery = previousJQuery;",
              "});"
            ].join('\n');
          }
        },
        // 设置文件所在地址, 版本号替换成变量, 这样之后只需修改 package.json 的版本信息
        url: 'https://raw.github.com/highslide-software/highcharts.com/v<%= pkg.version%>/js/highcharts.src.js',
        // 设置文件名字, 可参考原来源仓库中的名字来
        name: 'highcharts.js'
      },
      // ....
      exporting: {
        options: {
          transform: function(code) {
            return [
              'define(function(require, exports, module) {',
              code,
              "});"
            ].join('\n');
          }
        },
        url: 'https://raw.github.com/highslide-software/highcharts.com/v<%= pkg.version%>/js/modules/exporting.src.js',
        name: 'exporting.js'
      }
    }
  });

  grunt.loadGlobalTasks('spm-build');
  grunt.util._.merge(grunt.config.data, require('spm-build').config);

  grunt.loadTasks('../_tasks/download/tasks');
  grunt.registerTask('build', ['download', 'spm-build']);
};

写完之后, 就可以执行 spm build, 下载对应文件并按照需要修改代码. 下载的文件保存在 src/ 下, 可打开看下各个文件是否正确.

这个过程, 主要是做了从源仓库中下载 js/css 文件, 并对下载下来的代码进行处理, 比如 js 文件, 可以设置 transform 封装成 define(factory) 的形式. transform 中的函数参数 code 即为下载下来模块的代码, 你可以根据需要替换/添加其中的特殊代码.

编写简单的测试用例 spec.js

挑选模块中暴露的公共接口, 简单验证一下即可.

define(function(require) {
    var $ = require("$");
    var Highcharts = require('./src/highcharts');

    require('./src/exporting');
    require('./src/highcharts-more');

    describe('Highcharts', function() {
        it('should has spec memeber', function() {
            expect(Highcharts.version).to.be.a('string');
            expect(Highcharts.seriesTypes.gauge).to.be.a('function');
            expect(Highcharts.post).to.be.a('function');
        });
    });
});

之后将该模块所在目录名, 添加到 jquery/index.html 中的 modules 数组中, 在浏览器中打开 index.html, 查看用例是否通过.

编译 src/

一般测试用例通过后, 执行

cd highcharts
spm install
spm build

编译好的文件在 dist/ 目录. 只需看下各文件是否都已生成, 确保没有遗漏文件. 这步会根据对 src/ 下的文件, 进行 concat / transport 处理, 并生成源码和压缩后的代码. 具体请参考 spm 的文档

发布及取消发布

发布至源

spm build            // 发布之前先编译一次
spm publish -s spmjs // 发布当前版本
spm publish -s spmjs -f     // 强制发布源上已有版本, 这里需要有发布权限, 没有权限会给出错误提示, 申请权限请找 @lepture

spm unpublish jquery/[email protected]   // 从源上删除某个版本的模块
spm unpublish jquery/highcharts          // 从源上伤处某个模块的所有版本

提交至 github

git commit -a -m "A: add highcharts"
git push // 之后到 cmdjs/gallery 上提 pull request

注意: src/ 和 dist/ 目录都不需要提交至仓库中. 只需要 package.json, Gruntfile.js 和 spec.js.

使用

seajs.config({
    "alias": {
        "$": "jquery/jquery/1.10.1/jquery",
        "highcharts": "jquery/highcharts/3.0.4/highcharts",
        "highcharts-exporting": "jquery/highcharts/3.0.4/exporting",
        "highcharts-more": "jquery/highcharts/3.0.4/highcharts-more"
    }
});
seajs.use(["$", "highcharts"], function($, Highcharts) {
    // use Highcharts
    $("#demo").highcharts({
        //...
    });
});

检查各模块的版本更新

通过以下命令检查 jquery 或 gallery 下各模块有没更新版本

cd jquery or cd gallery
grunt check

结果有三列: 第一列为模块名字, 第二列为模块当前版本, 第三列为模块原仓库中的当前版本. 根据需要升级本地模块 package.json 中的 version. 请选择稳定版本. 开发中的版本不考虑. 升级版本之后, 需要重新 spm buildspm publish

gallery's People

Contributors

afc163 avatar atans avatar fool2fish avatar leoner avatar lepture avatar lileiseven avatar lizzie avatar paulguo avatar pierrewrs avatar popomore avatar seanliang avatar swainet avatar tsj1107 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gallery's Issues

download 支持 zip 包

比如 ztree 这种,没有外部可访问的文件,只有 zip 包,可下载 zip 包解压。

所有模块更新为最新的 transport 语法

把所有模块都更新成最新的transport 语法。

  • async ✔
  • backbone ✔
  • underscore ✔
  • iscroll ✔
  • coffee ✔
  • handlebars ✔
  • jasmine
  • jquery ✔
  • json ✔
  • labjs ✔
  • less ✔
  • marked ✔
  • moment ✔
  • mustache ✔
  • socketio ✔
  • store ✔
  • swfobject ✔
  • zepto ✔

dist 產生空文件

APEKC-201@APEKC201 /e/web/spmjs/gallery/bootstrap
$ cd ../respond

APEKC-201@APEKC201 /e/web/spmjs/gallery/respond
$ spm build


           Task: "clean:build" (clean) task

           Task: "spm-install" task

           Task: "transport:src" (transport) task
      transport: 0 files

           Task: "concat:css" (concat) task
       concated: 0 files

           Task: "transport:css" (transport) task
      transport: 0 files

           Task: "concat:js" (concat) task
       concated: 2 files

           Task: "copy:build" (copy) task

           Task: "cssmin:css" (cssmin) task

           Task: "uglify:js" (uglify) task
           file: ".build/dist/respond.js" created.

           Task: "clean:dist" (clean) task

           Task: "copy:dist" (copy) task
         copied: 2 files

           Task: "clean:build" (clean) task
       cleaning: .build...

           Task: "spm-newline" task
         create: dist/respond-debug.js
         create: dist/respond.js

           Done: without errors.


*沒有建立 src 文件夾

2013-10-17_115102

socketio的JSONP功能失效

如题,因为当跨域且不支持CORS的情况下socket.io会fallback到JSONP方式,这就需要全局中有io.j这个数组。

重新改造 transport 模块

目前一部分第三方模块已经提供压缩文件,而我们原有的方式是通过自己压缩第三方的源码,这样可能造成一些不可控的问题,因为第三方模块可能有自己的一些压缩规则。所以现在的transprot 方式改为如果原有模块已经包含压缩文件,我们需要增加一个压缩文件的 transport .

请问我构建模块的时候报错是什么问题?

版本信息:
elthon-mac:gallery elthon$ grunt --version
grunt-cli v0.1.9
grunt v0.4.1

执行npm install后下载的模块
elthon-mac:gallery elthon$ ls node_modules/
async expect.js grunt mocha request seajs
elthon-mac:gallery elthon$ cd json

进入“json”模块进行构建,报:Object # has no method 'loadGlobalTasks', 是我的grunt版本问题么?

elthon-mac:json elthon$ grunt build -v
Initializing
Command-line options: --verbose

Reading "Gruntfile.js" Gruntfile...OK

Registering Gruntfile tasks.
Reading package.json...OK
Parsing package.json...OK
Initializing config...OK
Loading "Gruntfile.js" tasks...ERROR

TypeError: Object # has no method 'loadGlobalTasks'
at Object.module.exports (/Users/elthon/Projects/oss/cmdjs/gallery/json/Gruntfile.js:25:9)
at loadTask (/Users/elthon/Projects/oss/cmdjs/gallery/node_modules/grunt/lib/grunt/task.js:312:10)
at Task.task.init (/Users/elthon/Projects/oss/cmdjs/gallery/node_modules/grunt/lib/grunt/task.js:424:5)
at Object.grunt.tasks (/Users/elthon/Projects/oss/cmdjs/gallery/node_modules/grunt/lib/grunt.js:113:8)
at Object.module.exports as cli
at Object. (/usr/local/lib/node_modules/grunt-cli/bin/grunt:41:20)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)

Running tasks: build
Warning: Task "build" not found. Use --force to continue.

Aborted due to warnings.

spm 找不到 html5shiv

$ spm info gallery/html5shiv

gallery/html5shiv
not found

是不是沒有推送到spm, 還是?
還有最新版本是 3.6.2

Thanks

Backbone: $丢失

Backbone从1.1.1版本开始修改了exports的方式:

(function(root, factory) {
  // Set up Backbone appropriately for the environment. Start with AMD.
  if (typeof define === 'function' && define.amd) {
    define(['underscore', 'jquery', 'exports'], function(_, $, exports) {
      // Export global even in AMD case in case this script is loaded with
      // others that may still expect a global Backbone.
      root.Backbone = factory(root, exports, _, $);
    });
  // Next for Node.js or CommonJS. jQuery may not be needed as a module.
  } else if (typeof exports !== 'undefined') {
    var _ = require('underscore');
    factory(root, exports, _);
  // Finally, as a browser global.
  } else {
    root.Backbone = factory(root, {}, root._, (root.jQuery || root.Zepto || root.ender || root.$));
  }
}(this, function(root, Backbone, _, $) {
  // 其余省略
  return Backbone;
}));

它写着“Next for Node.js or CommonJS. jQuery may not be needed as a module.”,因此在 factory 调用时并没有将 jQuery 对象传入,导致Backbone.$.相关的方法不可用。

刚开始接触 seajs 和 spm,不确定是否在封装前修改代码将 jQuery 参数传入?或者这本就是 Backone 的问题?烦请指教。

加载mocha 1.7.3失败

用spm安装mocha

var mocha = require("mocha");
mocha为{}

var mocha = require("mocha-debug");
在mocha-debug.js内部提示错误
Uncaught Error: failed to require "mocha-debug"

masonry封装

https://github.com/desandro/masonry/blob/master/masonry.js

 ( function( window ) {
  function masonryDefinition( Outlayer, getSize ) {
    var Masonry = Outlayer.create('masonry');
    code...
    return Masonry;
 }
 if ( typeof define === 'function' && define.amd ) {
   // AMD
   define( [
     'outlayer/outlayer',
     'get-size/get-size'
   ],
  masonryDefinition );
 } else {
   // browser global
    window.Masonry = masonryDefinition(
      window.Outlayer,
      window.getSize
    );
 }
 })( window );

我直接头尾加define封下,return Masonry; 改为 module.exports = Masonry;但是报错object is not a function 。。我哪里错了?谢谢~

json模块的问题

@leoner

json.transport第三行里的写法

return this.JSON = JSON;

会把原生的JSON对象给覆盖了

建议改成

return this.JSON = this.JSON || JSON;

这样就不会覆盖原生的JSON对象了

store模块的依赖问题

如题,store模块其实隐式的依赖到了JSON对象,而在package里没有指定,导致在低级浏览器下运行出错

P.S. 用seajs的preload不算通用式的解决方案,为了组件的通用性,个人还是希望能在package里去指定依赖

@lepture

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.