多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
这节我们演示如何将components的组件打包进生成的html中。 ## 处理模板 ### 1.新建文件目录 ![](https://box.kancloud.cn/cd1641c2c607e23e0e47bd25549d33f1_219x292.png) **layer.html** ~~~html <div class="layer"> 这是layer的内容 </div> ~~~ **layer.css** ~~~css .layer{ height: 100px; font-size: 50px; background-color: red; } ~~~ **layer.js** ~~~javascript import layerCss from './layer.css'; import template from './layer.html'; function layer(){ return{ name: 'layer', layerCss: layerCss, template: template } } export default layer; ~~~ 我们用的ES6的import语法将这个组件的css和html载入js,然后将访问的接口通过export default给出去,方便app.js访问我们这个组件. **模板index.html** ~~~html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>webpackDemo8</title> </head> <body> <div id="app"></div> </body> </html> ~~~ **app.js** ~~~javascript import Layer from './components/layer/layer'; const App = function(){ let app = document.getElementById('app'); let layer = new Layer(); app.innerHTML = layer.template; } new App(); ~~~ 我们通过ES6的import语法将layer.js导出的layer函数引入,然后用过new Layer()实例化这个函数,然后就可以访问layer内部的变量了,这里是找到id为app的标签,然后将定义的组件html插入id为app的标签里面。 ### 2.配置webpack.config ~~~javascript var path = require("path"); //webpack升级到2.0以后,路径需要引用这个模块 var htmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: { app: './src/app.js', }, output: { path: path.resolve(__dirname, './dist'), filename: 'js/[name]-bundle.js' }, module: { rules: [{ test: /\.js$/, //用正则匹配找到所有的js文件 include: path.resolve(__dirname, 'src'), //指定babel-loaders寻找的文件路径,注意需是绝对路径 exclude: path.resolve(__dirname, 'node_modules'), //排除node_modules文件下js,注意需是绝对路径 use: { loader: 'babel-loader' } }, { test: /\.css$/, include: path.resolve(__dirname, 'src'), //指定babel-loaders寻找的文件路径,注意需是绝对路径 exclude: path.resolve(__dirname, 'node_modules'), //排除node_modules文件下js,注意需是绝对路径 use: [{ loader: 'style-loader' }, //注意先后顺序,一般都要先用css-loader处理完然后用style-loader生成style标签,但webpack读取的顺序相反 { loader: 'css-loader' } ] }, { test: /\.html$/, use: { loader: 'html-loader' } } ] }, plugins: [ new htmlWebpackPlugin({ filename: 'index.html', template: 'index.html', inject: 'body', title: 'This is my plugin title.', }) ] } ~~~ 这里除了之前的loader和插件以外,新增了一个[html-loader](https://doc.webpack-china.org/loaders/html-loader/) 这个是将.html文件转为字符串模板,处理模板文件的做法: ①webpack将模板文件当做一个字符串进行处理。(这里使用的作坊) ②webpack将模板文件当成已经编译好的的模板的处理函数。 **安装** ~~~ npm install html-loader --save-dev ~~~ ### 3.成功生成,查看html ![](https://box.kancloud.cn/bb0e0bc8877e9f8259c6def72d8a478b_971x415.png) ## 处理ejs模板 在我们的实际项目中,我们的模板会用到模板语法,比如EJS模板,就需要用[ejs-loader](https://www.npmjs.com/package/ejs-loader)进行处理。 ### 1.修改组件layer **layer.html** ~~~html <div class="layer"> <%= name %> <% for (var i = 0; i < arr.length ; i++) { %> <%= arr[i] %> <% } %> </div> ~~~ ### 2.修改app.js ~~~javascript import Layer from './components/layer/layer'; const App = function(){ let app = document.getElementById('app'); let layer = new Layer(); app.innerHTML = layer.template({ name: 'ejs模板', arr: ['1','2','3'] }) } new App(); ~~~ ### 3.修改webpack.config ~~~javascript var path = require("path"); //webpack升级到2.0以后,路径需要引用这个模块 var htmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: { app: './src/app.js', }, output: { path: path.resolve(__dirname, './dist'), filename: 'js/[name]-bundle.js' }, module: { rules: [{ test: /\.js$/, //用正则匹配找到所有的js文件 include: path.resolve(__dirname, 'src'), //指定babel-loaders寻找的文件路径,注意需是绝对路径 exclude: path.resolve(__dirname, 'node_modules'), //排除node_modules文件下js,注意需是绝对路径 use: { loader: 'babel-loader' } }, { test: /\.css$/, include: path.resolve(__dirname, 'src'), //指定babel-loaders寻找的文件路径,注意需是绝对路径 exclude: path.resolve(__dirname, 'node_modules'), //排除node_modules文件下js,注意需是绝对路径 use: [{ loader: 'style-loader' }, //注意先后顺序,一般都要先用css-loader处理完然后用style-loader生成style标签,但webpack读取的顺序相反 { loader: 'css-loader' } ] }, { test: /\.html$/, use: { loader: 'ejs-loader' } } ] }, plugins: [ new htmlWebpackPlugin({ filename: 'index.html', template: 'index.html', inject: 'body', title: 'This is my plugin title.', }) ] } ~~~ 只需要把html的loader改成ejs-loader即可。 **安装** ~~~ npm install ejs-loader --save-dev ~~~ ### 4.成功生成,查看html ![](https://box.kancloud.cn/0c7a96a26667d7a6c81fbb71d5df8687_988x470.png) ## 处理图片文件 ### 1.修改layer.css ~~~css .layer{ height: 200px; font-size: 50px; background-color: red; background: url('../../assets/background.jpg') no-repeat; } ~~~ ### 2.配置webpack.config ~~~javascript var path = require("path"); //webpack升级到2.0以后,路径需要引用这个模块 var htmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: { app: './src/app.js', }, output: { path: path.resolve(__dirname, './dist'), filename: 'js/[name]-bundle.js' }, module: { rules: [{ test: /\.js$/, //用正则匹配找到所有的js文件 include: path.resolve(__dirname, 'src'), //指定babel-loaders寻找的文件路径,注意需是绝对路径 exclude: path.resolve(__dirname, 'node_modules'), //排除node_modules文件下js,注意需是绝对路径 use: { loader: 'babel-loader' } }, { test: /\.css$/, include: path.resolve(__dirname, 'src'), //指定babel-loaders寻找的文件路径,注意需是绝对路径 exclude: path.resolve(__dirname, 'node_modules'), //排除node_modules文件下js,注意需是绝对路径 use: [{ loader: 'style-loader' }, //注意先后顺序,一般都要先用css-loader处理完然后用style-loader生成style标签,但webpack读取的顺序相反 { loader: 'css-loader' } ] }, { test: /\.html$/, use: { loader: 'ejs-loader' } }, { test: /\.(jpg|png|gif|svg)$/, use:{ loader: 'file-loader?name=assets/[hash].[ext]' } } ] }, plugins: [ new htmlWebpackPlugin({ filename: 'index.html', template: 'index.html', inject: 'body', title: 'This is my plugin title.', }) ] } ~~~ 添加了[file-loader](https://www.npmjs.com/package/file-loader) **安装** ~~~ npm install --save-dev file-loader ~~~ ### 3.ejs模板中添加图片 ~~~javascript <div class="layer"> <%= name %> <% for (var i = 0; i < arr.length ; i++) { %> <%= arr[i] %> <% } %> </div> <img src="${require('../../assets/background.jpg')}"/> <!-- 注意这里使用es6模板语法和require --> ~~~ ### 4.成功生成,查看html ![](https://box.kancloud.cn/23ac5dee7a8c901a44f3840e45e31a18_1061x508.png) ## 图片太小与图片太大情况 图片太小:可以直接将图片用base64形式,减少向服务器的请求,借助[url-loader](https://www.npmjs.com/package/url-loader)里面limit参数进行处理。 图片太大:需要压缩一下,这个时候需要[img-loader](https://www.npmjs.com/package/img-loader) 这里就不做演示了,有兴趣的同学可以自己根据官网介绍进行实践尝试。