1下载

使用 coolie demo 命令下载本 demo。

  1. coolie demo 7

2同步模块

这里的同步模块指的是运行时,该模块是同步载入的(类似 NodeJS 里的 require)。

  1. require('module1'); // 运行到这里,module1 载入
  2. require('module2'); // 运行到这里,module2 载入

3demo

3.1初始化目录

新建coolie-demo7,目录结构为:

  1. coolie-demo7
  2. └── webroot-dev
  3. 1 directory, 0 files

3.2初始化文件

3.2.1package.json

webroot-dev 根目录下新建 package.json

  1. {
  2. "name": "coolie-demo7-webroot",
  3. "version": "2.0.0"
  4. }

3.2.2coolie.js

先下载模块加载器(coolie.js):

  1. cd webroot-dev
  2. npm install --save coolie.js
  3. coolie.js@2.0.8 node_modules/coolie.js

3.2.3coolie-config.js

如果你感兴趣,可以简单的看看coolie.js的源代码。接下来,我们来初始化模块加载器的配置文件:

  1. coolie init -j
  2. ┌────────────────────────────────────┐
  3. coolie-cli
  4. coolie@1.6.4
  5. The front-end development builder.
  6. └────────────────────────────────────┘
  7. init success >> /coolie-demo7/webroot-dev/coolie-config.js

修改为:

  1. /**
  2. * ======================================================
  3. * coolie.js 配置文件 `coolie-config.js`
  4. * 使用 `coolie init -j` 生成 `coolie-config.js` 文件模板
  5. * 前端模块加载器配置文件
  6. *
  7. * @link http://coolie.ydr.me/guide/coolie-config.js/
  8. * @author ydr.me
  9. * @version 2.0.0
  10. * @create 2016-05-28 20:05:12
  11. * ======================================================
  12. */
  13. coolie.config({
  14. // 模块模式,开发环境为 COMMONJS
  15. mode: 'CJS',
  16. // 入口模块基准路径,相对于当前文件
  17. mainModulesDir: '/',
  18. // node_modules 目录指向,相对于 mainModulesDir
  19. nodeModulesDir: '/node_modules/',【1
  20. // 手动指定 node 模块的入口文件,此时将不会去加载模块的 package.json
  21. // 除非你非常肯定,你加载的 node 模块的入口路径都是一致的
  22. // 否则不要修改配置此项
  23. // nodeModuleMainPath: 'src/index.js',
  24. // 是否为调试模式,构建之后会修改为 false
  25. debug: true,
  26. // 全局变量,用于模块构建的预定义变量判断压缩
  27. global: {}
  28. }).use();
  • 【1】:修改了nodeModulesDir属性值为/,表示入口模块目录为根目录。

3.2.4下载使用 node 模块

  1. npm install --save blear.utils.typeis
  2. blear.utils.typeis@1.0.2 node_modules/blear.utils.typeis

3.2.5index.js

然后我们来写入口模块了,新建index.js

  1. // index.js
  2. var date = require('./date.js');
  3. var typeis = require('blear.utils.typeis');
  4. alert('date typeis ' + typeis(date));

3.2.6date.js

然后新建date.js:

  1. // date.js
  2. module.exports = new Date();

依赖链条很清晰:

  1. index.js ==依赖于==> date.js + blear.utils.typeis

然后,来新建index.html

  1. <!doctype html>
  2. <meta charset="utf-8">
  3. <!--注意:-->
  4. <!--1. 这里的 script 标签多了 coolie 属性-->
  5. <!--2. 引用了 coolie.min.js-->
  6. <!--3. 增加了 data-config 属性-->
  7. <!--4. 增加了 data-main 属性-->
  8. <script coolie src="/node_modules/coolie.js/coolie.js"
  9. data-config="/coolie-config.js"
  10. data-main="index.js"></script>
  • coolie属性:表明该 script 是 coolie-cli(前端开发构建工具) 的管辖范围
  • coolie.min.js:前端模块加载器
  • data-config属性:前端模块加载器配置文件
  • data-main属性:模块入口文件地址,相对于data-config.js里的mainModulesDir属性(详细点这里

3.3前端构建前运行

webroot-dev目录下,使用构建同步模块(demo7) - 图1sts执行:

  1. sts
  2. sts >> A static server is running.
  3. open >> http://192.168.0.192:51741

构建同步模块(demo7) - 图2

如上图:

  • 在浏览器控制台打印了当前页面载入的模块,以及经过的时间
  • 正确的弹出了对话框,执行了模块方法

3.4前端构建配置

使用命令生成前端构建工具配置文件:

  1. coolie init -c
  2. ┌────────────────────────────────────┐
  3. coolie-cli
  4. coolie@1.6.4
  5. The front-end development builder.
  6. └────────────────────────────────────┘
  7. init success >> /coolie-demo7/src/coolie.config.js

修改配置文件(coolie.config.js)为:

  1. /**
  2. * ======================================================
  3. * coolie-cli 配置文件 `coolie.config.js`
  4. * 使用 `coolie init -c` 生成 `coolie.config.js` 文件模板
  5. * 当前配置文件所在的目录为构建的根目录
  6. *
  7. * @link http://coolie.ydr.me/guide/coolie.config.js/
  8. * @author ydr.me
  9. * @version 1.6.4
  10. * @create 2016-01-26 16:44:00
  11. * =======================================================
  12. */
  13. 'use strict';
  14. module.exports = function (coolie) {
  15. // coolie 配置
  16. coolie.config({
  17. // 是否在构建之前清空目标目录
  18. clean: true,
  19. // 目标配置
  20. dest: {
  21. // 目标目录,相对于当前文件
  22. dirname: '../webroot-pro/',
  23. // 目标根域
  24. host: '',
  25. // 版本号长度
  26. versionLength: 32
  27. },
  28. // js 构建
  29. js: {
  30. // 入口模块,相对于当前文件
  31. main: [
  32. // 支持 glob 语法
  33. //【1】
  34. './inedx.js'
  35. ],
  36. // coolie-config.js 路径,相对于当前文件
  37. 'coolie-config.js': './coolie-config.js',
  38. // js 文件保存目录,相对于 dest.dirname
  39. dest: './static/js/',
  40. // 分块配置
  41. chunk: []
  42. },
  43. // html 构建
  44. html: {
  45. // html 文件,相对于当前文件
  46. src: [
  47. // 支持 glob 语法
  48. 'index.html'
  49. ],
  50. // 是否压缩
  51. minify: true
  52. },
  53. // css 构建
  54. css: {
  55. // css 文件保存目录,相对于 dest.dirname
  56. dest: './static/css/',
  57. // css 压缩配置
  58. minify: {
  59. compatibility: 'ie7'
  60. }
  61. },
  62. // 资源
  63. resource: {
  64. // 资源保存目录,相对于 dest.dirname
  65. dest: './static/res/',
  66. // 是否压缩
  67. minify: true
  68. },
  69. // 原样复制文件,相对于当前文件
  70. copy: [
  71. //【4】
  72. // 支持 glob 语法
  73. //'./favicon.ico',
  74. //'./robots.txt'
  75. ]
  76. });
  77. // 使用 coolie 中间件
  78. // coolie.use(require('coolie-*'));
  79. // 自定义 coolie 中间件
  80. //coolie.use(function (options) {
  81. // // do sth.
  82. // return options;
  83. //});
  84. };
  • 【1】:修改入口文件路径为index.js,相对于配置文件所在的目录
  • 【2】:修改配置文件路径为coolie.config.js,相对于配置文件所在的目录
  • 【3】:修改 html 文件路径为index.html,相对于配置文件所在的目录
  • 【4】:移除了需要复制的文件配置

3.5前端构建

webroot-dev目录下执行前端构建:

  1. coolie build
  2. ┌──────────────────────────────┐
  3. coolie@2.0.0
  4. 前端工程化构建工具
  5. 官网:https://coolie.ydr.me/ │
  6. └──────────────────────────────┘
  7. step 1/6 >> parse coolie-cli profile
  8. coolie config >> /coolie-demo7/webroot-dev/coolie.config.js
  9. src dirname >> /coolie-demo7/webroot-dev
  10. dest dirname >> /coolie-demo7/webroot-pro/
  11. step 2/6 >> copy files
  12. copy files >> no files are copied
  13. step 3/6 >> build main modules
  14. parse module >> 2 modules parsed
  15. build main >> will build 1 main modules
  16. 1/1 >> /index.js
  17. step 4/6 >> generate coolie.js profile
  18. coolie-config.js >> mainModulesDir: "/static/js/main/"
  19. coolie-config.js >> asyncModulesDir: "../async/"
  20. coolie-config.js >> chunkModulesDir: "../chunk/"
  21. coolie-config.js >> callbacks: 0
  22. coolie-config.js >> ../webroot-pro/static/js/334e1ea3301b33071eb3c5c1a510fd2d.js
  23. step 5/6 >> build htmls
  24. 1/1 >> /index.html
  25. step 6/6 >> generate coolie map
  26. coolie map >> ../webroot-pro/coolie-map.json
  27. build success >> elapsed 430ms, at 2016-05-28 20:12:41.624

3.6前端构建后运行

切换到webroo-pro(构建之后的目录),使用构建同步模块(demo7) - 图3sts执行:

  1. cd ../webroot-pro
  2. sts
  3. sts >> A static server is running.
  4. open >> http://192.168.0.192:51741

构建同步模块(demo7) - 图4

3.7分析构建结果

来分别看下构建之后的文件内容吧,先看coolie-map.json

  1. {
  2. "/index.html": {
  3. "main": [
  4. {
  5. "src": "../webroot-dev/index.js",
  6. "dest": "/static/js/main/5f74f36f0751b44b4f8f3b9d9788b234.js",
  7. "deps": [
  8. "../webroot-dev/date.js",
  9. "../webroot-dev/node_modules/blear.utils.typeis/src/index.js"
  10. ]
  11. }
  12. ],
  13. "js": [
  14. {
  15. "dest": "/static/js/0996319be2c4f9517575b54dcc4af897.js",
  16. "deps": [
  17. "../webroot-dev/node_modules/coolie.js/coolie.js"
  18. ]
  19. }
  20. ],
  21. "css": [],
  22. "res": []
  23. }
  24. }

从文件内容上很容易的看出来,构建的 html 为 index.html,该 html 文件依赖了一个入口文件../webroot-dev/index.js,构建之后的路径为/static/js/main/5f74f36f0751b44b4f8f3b9d9788b234.js,该入口模块依赖了一个模块../src/date.js

先看入口模块文件(5f74f36f0751b44b4f8f3b9d9788b234.js):

  1. /*coolie built*/
  2. define("0",["1","2"],function(e,t,a){var i=e("1"),n=e("2");alert("date typeis "+n(i))});
  3. define("1",[],function(e,n,t){t.exports=new Date});
  4. define("2",[],function(e,n,t){"use strict";var r="undefined",o=function(e){return void 0!==e},u=t.exports=function(e){if(typeof e===r)return r;if(e&&e===e.window)return"window";if(typeof document!==r&&e===document)return"document";if(null===e)return"null";if(e!==e)return"nan";var n=Object.prototype.toString.call(e).slice(8,-1).toLowerCase();if(1===e.nodeType&&e.nodeName)return"element";try{if("object"===n&&"callee"in e&&o(e))return"arguments"}catch(t){}return n},i=function(e){return function(n){return u(n)===e}};u.String=i("string");u.Number=i("number");u.Array=i("array");u.Object=i("object");u.Function=i("function");u.Null=i("null");u.Undefined=i("undefined");u.Regexp=u.RegExp=i("regexp");u.Boolean=i("boolean");u.Window=i("window");u.Document=i("document");u.Element=i("element");u.Nan=u.NaN=i("nan");u.Arguments=i("arguments");u.Date=i("date");u.Error=i("error")});

从文件内容上可以清晰的看到:

  • 入口模块的 ID 为 0,依赖了一个ID 为 1 和 2 两个模块
  • ID 为 1 的模块在第 2 行
  • ID 为 2 的模块在第 3 行
  • 模块的路径都压缩成了单个字符
  • 模块的内的requireexportsmodule都经过了压缩
  • 文件开头打上了 coolie 的标记
    然后再来看看index.html(已格式化):
  1. <!doctype html>
  2. <meta charset="utf-8">
  3. <script src="/static/js/0996319be2c4f9517575b54dcc4af897.js"
  4. data-config="/static/js/334e1ea3301b33071eb3c5c1a510fd2d.js"
  5. data-main="5f74f36f0751b44b4f8f3b9d9788b234.js"></script>
  6. <!--coolie built-->

可以明显的看出,<script>标签上的属性变化很大:

  1. <script coolie src="/node_modules/coolie.js/coolie.js"
  2. data-config="/coolie-config.js"
  3. data-main="index.js"></script>
  4. =>
  5. <script src="/static/js/0996319be2c4f9517575b54dcc4af897.js"
  6. data-config="/static/js/334e1ea3301b33071eb3c5c1a510fd2d.js"
  7. data-main="5f74f36f0751b44b4f8f3b9d9788b234.js"></script>

一一对应来看:

  • coolie:这个属性标记被删除了
  • src:原始的资源被版本管理了
  • data-config:配置文件的路径也被修改了
  • data-main:入口模块的文件名也变化了
    接下来,看看配置文件(334e1ea3301b33071eb3c5c1a510fd2d.js,已格式化)吧:
  1. /*coolie built*/
  2. coolie.config({
  3. debug: !1,
  4. mode: "AMD",
  5. asyncModulesMap: {},
  6. chunkModulesMap: {},
  7. built: "coolie@2.0.0",
  8. mainModulesDir: "/static/js/main/",
  9. asyncModulesDir: "../async/",
  10. chunkModulesDir: "../chunk/",
  11. global: {}
  12. }).use();

配置文件里多了很多配置信息,详细点这里阅读

4github

构建同步模块(demo7) - 图5github.com

原文: https://coolie.ydr.me/guide/build-sync-module