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 ...
随机推荐
- TL-WR703Nv1.7刷写openwrt固件
TP-LINK TL-WR703N是一个小型的路由器,可以有线转WiFi,3G转WiFi,很多人拿它刷openwrt系统,然后可以在上面各种搞事. V1.7以前 通常刷openwrt的做法是, 下载一 ...
- centos7 简单搭建lnmp环境
1:查看环境: 1 2 [root@10-4-14-168 html]# cat /etc/redhat-release CentOS release 6.5 (Final) 2:关掉防火墙 1 [r ...
- C#基础,目录
首先,要说明一下本系列会以使用C#为侧重点,不会系统的.大篇量的去解说一些名词,比如:runtime.IL等.文章会在合适的时候对用到的基本概念进行简述.如果你是初学者,建议你也不要过度的去纠结,等你 ...
- ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现
很长一段时间以来,我都在思考如何在ASP.NET Core的框架下,实现一套完整的事件驱动型架构.这个问题看上去有点大,其实主要目标是为了实现一个基于ASP.NET Core的微服务,它能够非常简单地 ...
- 》》css3--动画
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 【leetcode】123. Best Time to Buy and Sell Stock III
@requires_authorization @author johnsondu @create_time 2015.7.22 19:04 @url [Best Time to Buy and Se ...
- Android4.0-4.4 加入支持状态栏显示耳机图标方法(支持带不带MIC的两种耳机自己主动识别)
效果如图: 一. 在frameworks/base/packages/SystemUI/res/values/strings.xml 里加入 <string name="headset ...
- 原来你是这样的JAVA[01]-基础一瞥
1.Java是什么呢? Java不仅是一门语言,而且是一个完整的平台,有一个庞大的库,其中包含了很多可重用的代码和一个提供安全性.跨操作系统的可移植性以及自动垃圾收集等服务的执行环境. 2.JDK 和 ...
- Python 项目实践一(外星人入侵小游戏)第二篇
接着上次的继续学习. 一 创建一个设置类 每次给游戏添加新功能时,通常也将引入一些新设置.下面来编写一个名为settings的模块,其中包含一个名为Settings的类,用于将所有设置存储在一个地方, ...
- C#开发微信门户及应用(47) - 整合Web API、微信后台管理及前端微信小程序的应用方案
在微信开发中,我一直强调需要建立一个比较统一的Web API接口体系,以便实现数据的集中化,这样我们在常规的Web业务系统,Winform业务系统.微信应用.微信小程序.APP等方面,都可以直接调用基 ...