Coder Social home page Coder Social logo

loader-builder's Introduction

loader-builder

Hackage-Deps Build Status Coveralls github

Introduction

Loader's builder

用于Loader的构建器。构建器用于扫描制定目录的视图文件,将Loader语法的调用提取出来,生成资源文件的关系映射。同时还对.less.styl.coffee.es格式的文件进行编译,将其转换为普通的.js.css文件。同时还会将编译好的文件通过uglify/cleancss进行压缩。对同一个Loader标签下的js和css文件,还会将其combo成一个文件,并计算出hash。

builder完成了静态文件相关的如下操作:

  • 将源码翻译为原生的JavaScript和CSS,提升开发体验
    • 支持less
    • 支持stylus
    • 支持coffee
    • 支持babel
  • 压缩JavaScript和CSS文件,减少文件体积
    • 保留debug文件,用于在线调试
  • 合并多个文件,减少请求数量
  • 计算文件签名,利于增量式发布
    • 支持任意文件的引入
    • 签名.css中的文件

Loader标签

通过Loader来引入css和js的方式称为Loader标签。Builder能根据Loader/css/js/done的关键字来提取标签。

<%- Loader('/assets/bootstrap-3.3.7/css/bootstrap.css', '/assets/scripts/bootstrap.js')
    .css('/assets/bootstrap-3.3.7/css/bootstrap.min.css')
    .js('/assets/scripts/lib/jquery-3.1.1.min.js')
    .js('/assets/bootstrap-3.3.7/js/bootstrap.min.js')
    .done(assets, CDN) %>

<img src="<%=Loader.file('/assets/images/logo.png').done(assets, CDN)%>" class="nav-logo">

构建

为了配合Loader的使用,builder需要通过构建的方式来生成静态文件的映射。其格式如下:

{
  "/assets/images/logo.png": "/assets/images/logo.b806e460.hashed.png",
  "/assets/scripts/bootstrap.js": "/assets/scripts/bootstrap.121539c7.min.js",
  "/assets/bootstrap-3.3.7/css/bootstrap.css": "/assets/bootstrap-3.3.7/css/bootstrap.b8e0f876.min.css"
}

如果需要线上执行,需要该对象的传入。生成方式为:

$ builder <views_dir> <output_dir>
$ # 或者
$ npm install loader-builder --save
$ ./node_modules/.bin/builder <views_dir> <output_dir>

以上脚本将会遍历视图目录中寻找Loader().js().css().done()这样的标记,然后得到合并文件与实际文件的关系。如以上的/assets/scripts/bootstrap.js文件并不一定需要真正存在,进行扫描构建后,会将相关的js文件进行编译和合并为一个文件。并且根据文件内容进行md5取hash值,最终生成/assets/scripts/bootstrap.121539c7.min.js这样的文件。

遍历完目录后,将这些映射关系生成为assets.json文件,这个文件位于<output_dir>指定的目录下。使用时请正确引入该文件,并借助服务端将其传递给.done()函数,作为assets参数。比如:

var assets = require('./assets.json');
// app.js 让assets变量在视图中可见
this.state.assets = assets;
// view.html 直接使用
<%=Loader.file('/assets/images/logo.png').done(assets)%>
// dev
// => /assets/images/logo.png
// production
// => /assets/images/logo.b806e460.hashed.png

Support CDN

现在的CDN通常都具备自动回源功能,当配合CDN时,可以传入CDN前缀地址,作为.done(assets, CDN)的第二个参数。比如:

// app.js 让CDN变量在视图中可见
this.state.CDN = 'http://cdn_domain';
// view.html 直接使用
<%=Loader.file('/assets/images/logo.png').done(assets, CDN)%>
// => http://cdn_domain/assets/images/logo.b806e460.hashed.png

如果不使用CDN,传入空字符串即可,表示从当前服务器拉取文件。

Support Debug

loader-builder默认会帮助生成一个与编译合并后的文件相关的文件用于支持线上调试。比如/assets/scripts/bootstrap.121539c7.min.js对应的调试文件就是/assets/scripts/bootstrap.121539c7.debug.js。将.min.修改为.debug.即可。

通过debug文件,可以借助fiddler/anyproxy之类的HTTP请求转发工具进行对线上的代码调试。

通过添加--no-debug开关可以关闭debug文件的输出。如下所示:

$ builder <views_dir> <output_dir> --no-debug

License

The MIT license

loader-builder's People

Contributors

jacksontian avatar sinchang avatar

Stargazers

 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

loader-builder's Issues

缓存之前编译的结果

现在单次编译的时候是不是比原来快一点了?

我看在一次编译中,如果一个文件被编译过了,那么第二次的用时是 0ms。

能不能让多次编译也可以重用结果?在 loader-builder 里面弄个 .cache 文件夹,如果文件 md5 在这个里面找得到,就直接用里面内容的结果。
现在每次编译 jquery 都是 3000ms。我看 webpack 是有这方面缓存的。只编译改动的部分。

构建 cvg 图片报错

构建时,css中有以下cvg图片会报错

background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");

image

编译问题

编译时会生成两个文件 ,min与debug文件,想问一下可不可以让我自己决定要不要编译生成debug文件,正式环境中,我不希望生成出debug

执行之后,原文件未进行压缩

现在使用./node_modules/loader-builder/bin/builder ./views/ / 压缩之后,min 文件不会合并压缩,还是原文件 ,记得以前是会将原文件压缩成最小文件,不知道是什么问题

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.