webpack之loader实践
初识前端模板概念的开发者,通常都使用过underscore的template方法,非常简单好用,支持赋值,条件判断,循环等,基本可以满足我们的需求。
在使用Webpack搭建开发环境的时候,如果要使用underscore的template方法进行前端模板的渲染,我们可以把模板代码独立到模版文件中保存。如何将模板文件加载到我们的JavaScript中进行模板渲染,就成了我们首先需要解决的问题。
说道这里,就必须提到Webpack中的loader(加载器)的概念,webpack支持通过loader的方式转换应用程序的资源文件,而我们的模板文件也需要对应的loader去进行加载,才能支持我们开发。
segmentfault中leftstick讲到目前可以支持template加载的有raw-loader,html-loader,template-html-loader,ejs-loader。。。。。。【更多的列表参考templating】
不同的加载器略有不同,表现在加载完之后,在JS代码中的表现,有的是返回字符串,有的则是JS对象或方法。
我们尝试使用raw-loader来处理,raw-loader的官方解释是【将文件加载为字符串】,因此我们可以将模板文件加载成字符串,然后使用underscore去渲染成最终的HTML。
我们使用一下配置简单构建一个webpack的环境。
package.json
{
  "name": "tpl-webpack",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "html-webpack-plugin": "^2.28.0",
    "raw-loader": "^0.5.1",
    "underscore": "^1.8.3",
    "webpack": "^3.0.0"
  }
}
webpack.config.js
var HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
    entry: './index.js',
    output: {
        filename: 'bundle.js'
    },
    module: {
        loaders:[
            {
               test: /\.tpl$/,
               use: 'raw-loader'
            }
        ]
    },
    plugins: [new HtmlWebpackPlugin()]
};
模板代码 index.tpl
<% _.each(data, function(n){ %>
    <p>姓名:<%= n.name %>,年龄:<%= n.age %>,性别:<%= n.sex %></p>
<% }); %>
index.js
 var _ = require('underscore');
 // 这里可以看到indexTplFile只是字符串
 var indexTplStr = require('./index.tpl');
 // template方法将其封装成一个方法
 var indexTpl = _.template(indexTplStr);
 var data = [
     {
         name: 'mike',
         age: 18,
         sex: '男'
     },
     {
         name: 'nina',
         age: 20,
         sex: '女'
     },
     {
         name: 'elle',
         age: 26,
         sex: '女'
     }
 ];    
 document.body.innerHTML = indexTpl({data:data});
index.js
运行npm install 之后,运行webpack,打开index.html,就可以看到如下结果。
姓名:mike,年龄:18,性别:男
姓名:nina,年龄:20,性别:女
姓名:elle,年龄:26,性别:女
但是可以看得出来,在渲染模板的过程中,执行了三行代码,如果我们想只用一行代码就生成最终的HTML字符串,继续尝试ejs-loader 。
webpack.config.js
 var webpack = require('webpack');
 var HtmlWebpackPlugin = require('html-webpack-plugin');
 module.exports = {
     entry: './index.js',
     output: {
         filename: 'bundle.js'
     },
     module: {
         loaders:[
             {
                 test: /\.tpl$/,
                 loader: 'ejs-loader?variable=data'
             },
         ]
     },
     plugins: [
         new HtmlWebpackPlugin(),
         // 提供全局变量_
         new webpack.ProvidePlugin({
             _: "underscore"
         })
     ]
 };
在代码中使用也变得非常简单,require对应的tpl文件之后,直接就可以渲染对应的html模板。
var indexTpl = require('./index.tpl');
document.body.innerHTML = indexTpl(data);
通过raw-loader和ejs-loader的对比,我们可以对webpack的loader使用有了一些认识,那就是loader是将不同类型的文件通过某种解析方式模块化到我们的代码中,然后提供给Javascript进一步的处理。
代码地址:https://github.com/gebin/underscore-tpl-loader-demo
webpack之loader实践的更多相关文章
- webpack的入门实践,看这篇就够了
		
webpack的入门实践 我会将所有的读者概括为初学者,即使你可能有基础,学习本节之前我希望你具有一定的JavaScript和node基础 文中的 ... ...代表省略掉部分代码,和上面的代码相同 ...
 - webpack之loader和plugin简介
		
webpack之loader和plugin简介 webpack入门和实战(二):全面理解和运用loader和plugins webpack入门(四)——webpack loader 和plugin w ...
 - webpack之Loader
		
我们知道webpack的优点之一就是专注于处理模块化的项目,能做到开箱即用,但同时这也是webpack的缺点,只能用于模块化开发的项目,例如:Vue,React,Angular.Webpack在进行打 ...
 - webpack最佳入门实践系列(6)
		
10.css模块化 10.1.什么是css模块? CSS模块就是所有的类名都只有局部作用域的CSS文件,当你在一个JavaScript模块中导入一个CSS文件时,CSS模块将会定义一个对象,将文件中类 ...
 - Webpack 之 Loader 的使用
		
安装 loaders 如果loader在npm里,可以这样安装: $ npm install xxx-loader --save 或者 $ npm install xxx-loader --save- ...
 - webpack + vue最佳实践
		
webpack + vue最佳实践 我的原文地址:http://www.xiaoniuzai.cn/2016/10/04/webpack%20+%20vue%E6%9C%80%E4%BD%B3%E5% ...
 - 学习笔记:webpack深入与实践(一)
		
一.webpack基本介绍 webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler). 四个核心概念: 入口(entry):指示 webpack 应该 ...
 - webpack中loader和plugin的概念理解
		
对于 loader ,它就是一个转换器,将A文件进行编译形成B文件,这里操作的是文件,比如将 A.scss 或 A.less 转变成 B.css,单纯的文件转换过程: 对于 plugin,它就是一个扩 ...
 - webpack进阶--loader
		
webpack的核心就是它的配置文件,只要配置好配置文件webpack就可以用得利索-- 而配置文件主要就是7个部分entry.output.plugins.resolve.devserver(web ...
 
随机推荐
- 高质量PHP代码的50个实用技巧必备(上)
			
1.不要使用相对路径 常常会看到: ? 1 require_once('../../lib/some_class.php'); 该方法有很多缺点: 它首先查找指定的php包含路径, 然后查找当前目录. ...
 - 深入理解php底层:php生命周期
			
1.PHP的运行模式: PHP两种运行模式是WEB模式.CLI模式.无论哪种模式,PHP工作原理都是一样的,作为一种SAPI运行. 1.当我们在终端敲入php这个命令的时候,它使用的是CLI. 它就像 ...
 - NGUI_概述
			
序言:这是张三疯第一次开始NGUI插件的学习,刚开始学习,肯定有很多漏洞,后期会及时的补上的. 希望大家可以见谅,希望大佬多多指教. 一.什么是NGUI: NGUI是严格遵循KISS原则并用C#编写的 ...
 - SAP GUI 750 安装包 及 补丁3 共享
			
SAP GUI 750 安装包 及 补丁3 共享 链接: https://pan.baidu.com/s/1hstkfUs%20 密码: ggbz -------------------------- ...
 - (三)—Linux文件传输与mysql数据库安装
			
文件传输工具使用 为了速成,关于linux系统的学习都先放一放,用到哪个知识点就查哪个,这里想在linux下装一些服务练练手,最先想到的就是装个mysql数据库试试. 因为我用的是虚拟机下的li ...
 - Oracle中用户(User)和模式(Schema)的概念
			
数据库理论中数据库用户和数据库模式并没有必定的联系.具体的数据库模式解释能够在这里找到: http://stackoverflow.com/questions/2674222/what-is-purp ...
 - 一张图让你明确Android Touch事件的传递机制
 - iOS8 UILocalNotification 添加启动授权
			
猴子原创.欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/46810357 ...
 - 18、Cocos2dx 3.0游戏开发找小三之cocos2d-x,请问你是怎么调度的咩
			
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30478251 Cocos2d 的一大特色就是提供了事 ...
 - 数学之美?编程之美?数学 + 编程= unbelievable 美!
			
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:Rusu 导语 相信大家跟我一样,偶尔会疑惑:曾经年少的时候学习过的那么多的复杂的数学函数,牛逼的化学方程式,各种物理原理.公式,到底有 ...