使用 Browserify 时引入文本文件(style和template)

/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+bash+css-extras+handlebars+jade+java+less+php+php-extras+python+scss+typescript */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/

code[class*="language-"],
pre[class*="language-"] {
color: black;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, ‘Andale Mono‘, monospace;
direction: ltr;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
line-height: 1.5;

-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;

-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}

pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}

pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
code[class*="language-"]::selection, code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}

@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}

/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}

:not(pre) > code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}

/* Inline code */
:not(pre) > code[class*="language-"] {
padding: .1em;
border-radius: .3em;
}

.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}

.token.punctuation {
color: #999;
}

.namespace {
opacity: .7;
}

.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}

.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}

.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #a67f59;
background: hsla(0, 0%, 100%, .5);
}

.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}

.token.function {
color: #DD4A68;
}

.token.regex,
.token.important,
.token.variable {
color: #e90;
}

.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}

.token.entity {
cursor: help;
}

目前来讲模块化已经是Web前端开发的标配了,主流无非是CommonJS规范和AMD规范

有人纳闷了,CMD呢?鸿星尔克之于美津浓,感受下,自家东西不表多

以AMD规范的翘楚 RequireJS 举例,它提供了requirejs-text插件,使得开发者可以异步地引入文本文件,如:

require(["some/module", "text!some/module.html", "text!some/module.css"],
    function(module, html, css) {
        //the html variable will be the text
        //of the some/module.html file
        //the css variable will be the text
        //of the some/module.css file.
    }
);

这时候我们已经在匿名的回调函数中拿到了htmlcss的实参字符串,html的模板字符串可以通过innerHTML使用,但是css字符串还需要插入进style才能生效,如:

    ···

        document.getElementsByTagName("style")[0].innerHTML = css;

    ···

这时一个模块的三个基本要素(模板、样式、脚本)就加载齐全了。

插一句, SeaJS同样使用插件实现了引入文本文件的功能
`seajs-text`实现了加载模板字符串的功能,
`seajs-css`实现了加载样式表字符串的功能
`seajs-style`能够加载一个css文件,和link标签一样

那么Browserify是如何来实现以上功能的呢?

作为前端CommonJS化的宠儿,目前模块化开发的绝对主流Browserify,配合HTML5script标签新属性async,可以无阻塞的加载模块

需要注意的是:`async`属性一旦使用,就要考虑好`browserify`打包好的那些模块是否有依赖性,如果有依赖性,建议把这些依赖的模块打包为一个模块,不然async标示过的脚本是不会等待`DomReady`之后再执行的,这样很危险

这里不会介绍Browserify的使用场景以及怎么使用,而是为了解决特定的引入文本文件的功能,这里默认大家已经知晓了它的简单使用,不明请去官网查阅

Browserify使用了transform以及配合transform的相应插件实现了引入模板、样式等等文本文件的功能


而transform又是什么?

Transform source code before parsing it for require() calls with the transform function or module name tr

就是说,在解析require调用之前来转换引入的源代码,通过这一层类似于中间件的功能,使得browserify在拓展性上大有可为

在项目中我习惯使用CLI,用watchify配合transform插件,来实现实时转化和编译


怎么引入模板文件

我使用过的三个transform插件可以实现:

stringifyhtml2js-browserify非常类似,使用API也类似,一起提及

项目使用中:

    npm install -S-dev browserify
    npm install -S-dev watchify
    npm install -S-dev stringify

或者html2js-browserify

    npm install -S-dev browserify
    npm install -S-dev watchify
    npm install -S-dev html2js-browserify

新建html文件,编写需要使用的模板(以Ejs举例)

../templates/header.html

    <header>
        <nav>
            <span class="home">Home</span>
            <span class="user">MyZone</span>
            <% if (isAmin) { %>
                <span>
                    Welcome! <%= name %> administer
                <span>
            <% } %>
        </nav>
    </header>

在我们的CommonJS模块里就可以使用了

../modules/header/header.js

    var $ = require(‘jquery‘);
    var _ = require(‘underscore‘);
    var tpl = require(‘../../templates/header.html‘);

    var data = {
        name: ‘转二‘,
        isAdmin: true
    };

    $(‘.header‘).html(_.template(tpl)(data));

最简单的命令行(使用wacthify附加监视功能)如下:

    browserify -t stringify header.js -o header_bundle.js

或者

    browserify -t html2js-browserify header.js -o header_bundle.js

怎么引入样式文件

browserify-css

    npm install -S-dev browserify
    npm install -S-dev watchify
    npm install -S-dev browserify-css

app.css:

    @import url("modules/foo/index.css");
    @import url("modules/bar/index.css");
    body {
        background-color: #fff;
    }

app.js:

    var css = require(‘./app.css‘);
    console.log(css);

编译时如果添加参数 --autoInject=true,那么你的HTML文件的head标签将被插入style,否则需要你手动插入

    watchify -t browserify-css [ --autoInject=true ] app.js > bundle.js

cssify

这个插件使用的人最多,可能是因为最简单

    npm install -S-dev browserify
    npm install -S-dev watchify
    npm install -S-dev cssify

style.css:

    body {
      background: pink;
    }

app.js:

var styleNode = require(‘./style.css‘);

console.log(styleNode);

编译时默认将require的样式表插入head标签

    watchify -t cssify app.js > bundle.js

require-stylify为例,node-lessify很类似,但是只能编译less

    npm install -S-dev browserify
    npm install -S-dev watchify
    npm install -S-dev require-stylify

app.js

    require(‘./less/main.less‘);
    require(‘./sass/sassFile.scss‘);

编译后被引入的样式表就会出现在head标签中了,

    watchify -t require-stylify app.js > bundle.js

实际上样式被编译后,生成的css文件直接存在于预处理文件的同目录下

即 ./less/main.css ./sass/sassFile.css



以上,个人觉得虽然失去了异步模块的特性,但是作为现代模块工具,Browserify配合script标签的async属性,完全可以适用于生产环境,而且相应灵活性更高,社区的插件更丰富。

感谢阅读

同步自个人博客:http://www.gyroer.com

时间: 2024-10-13 16:52:56

使用 Browserify 时引入文本文件(style和template)的相关文章

WPF DataGrid Custommization using Style and Template

转载:http://www.codeproject.com/Articles/586132/WPF-DataGrid-Custommization-using-Style-and-Templa WPF DataGrid Custommization using Style and Template Hiren Khirsaria, 2 May 2013 CPOL customize DataGridRowHeader, DataGridColumnHeader, DataGridCell, Da

WPF QuickStart系列之样式和模板(Style and Template)

在WPF桌面程序中,当我们想构建一个统一的UI表现时(在不同操作系统下,显示效果一致),此时我们就需要使用到WPF中的样式和模板技术.简单来说,如果我们需要简单的给一个Button设置宽,高,Margin等,可以使用Style来指定这一系列的属性.可以把Style理解为一个属性的集合.如果需要完全改变控件的样子,就需要使用到Template技术,相当于给控件换一层皮,不过Button还是Button,它原有的行为(Click事件)还存在.而且我们仅需要在XAML中遍可以完成对样式和模板的定义和重

WPF QuickStart系列之样式和模板(Style and Template) Part1

在WPF桌面程序中,当我们想构建一个统一的UI表现时(在不同操作系统下,显示效果一致),此时我们就需要使用到WPF中的样式和模板技术.简单来说,如果我们需要简单的给一个Button设置宽,高,Margin等,可以使用Style来指定这一系列的属性.可以把Style理解为一个属性的集合.如果需要完全改变控件的样子,就需要使用到Template技术,相当于给控件换一层皮,不过Button还是Button,它原有的行为(Click事件)还存在.而且我们仅需要在XAML中遍可以完成对样式和模板的定义和重

使用MyEclipse生成Java注释时,使用的Code Template

设置注释模板的入口: Window->Preference->Java->Code Style->Code Template, 然后展开Comments节点就是所有需设置注释的元素. 以下是部分示例: 文件(Files)注释标签: /** * @projectName SpringMVC * @package com.candy.candy.test.CodeStyleTemplate.java * @Copyright Copyright(c) 2014 Candy工会 * @a

外引js — 先引入cdn,cdn失效时引入本地js

参考:http://www.tianshan277.com/563.html 效果: html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>js加载</title> <script> function errorload(elem) { //cdn错误 if (elem.getAttri

Maven打包时引入本地jar包

<!--pom.xml-->..... <dependencies> <dependency> <groupId>com.xxxxxx</groupId> <artifactId>xxxxxx</artifactId> <version>x.x.x</version><!--版本随意填--> <scope>system</scope> <systemPath

vue用webpack打包时引入es2015插件

1.安装依赖包 $ npm install --save-div babel-preset-es2015 ps:babel-loader.babel-core应该是默认装好的,如果没有安装,请重新安装 2.修改[webpack.config.js]配置文件找到 /\.js$/的rules,进行修改 { test: /\.js$/, use: [{ loader: 'babel-loader', options: { presets: ['es2015'] } }], exclude: /node

Expression Blend实例中文教程(12) - 样式和模板快速入门Style,Template

在上一篇,介绍了Visual State Manager视觉状态管理器,其中涉及到控件的样式(Style)和模板(Template),本篇将详细介绍样式(Style)和模板(Template)在Silverlight项目中的应用,并介绍如何使用Blend设计样式(Style)和模板(Template). 在LOB(Line-of-Business)企业级应用项目开发中,为了使项目的视觉效果多样化,不仅仅使用动画效果,而且经常还需要修改部分控件的样式(Style)和模板(Template). 在S

wpf ListBox 双击事件时在子项添加Style 确保选中

<ListBox ItemTemplate="{StaticResource CardPictureTemplate}" VirtualizingPanel.CacheLength="20,20" MinWidth="160" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.CacheLengthUnit="Item" x:Name=