1、postcss-loader:浏览器兼容,给需要写兼容代码的样式添加前缀
2、loader是按照从右往左的顺序执行的
安装ejs-loader:
npm install ejs-loader --save-dev
app.js
import './css/common.css';
import Layer from './components/layer/layer.js';
const App = function() {
var dom = document.getElementById('app');
var layer = new Layer();
dom.innerHTML = layer.tpl({
name: 'john',
arr: ['apple', 'xiaomi', 'oppo']
});
};
new App();webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
entry: './src/app.js',
output: {
filename: 'js/[name].bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.js$/,
loader: 'babel-loader',
// 排除
exclude: /node_modules/,
query: {
presets: ["@babel/preset-env"]
}
},
{
test: /\.html$/,
loader: 'html-loader'
},
{
test: /\.tpl$/,
loader: 'ejs-loader'
},
{
test: /\.css$/,
use: [
'style-loader',
// 用来处理css中引入的css
{ loader: 'css-loader', options: { importLoaders: 1 } },
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: [
require('autoprefixer')({
broswers: ['last 5 versions']
}),
]
}
}
]
},
{
test: /\.less$/,
use: [
'style-loader',
// 用来处理css中引入的css
'css-loader',
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: [
require('autoprefixer')({
broswers: ['last 5 versions']
}),
]
}
},
{ loader: 'less-loader'}
]
},
{
test: /\.scss$/,
use: [
'style-loader',
// 用来处理css中引入的css
'css-loader',
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: [
require('autoprefixer')({
broswers: ['last 5 versions']
}),
]
}
},
{ loader: 'sass-loader'}
]
}
]
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
filename: 'index.html',
// html 标题
title: 'this is a.html',
// 使用模板
template: 'index.html',
// script标签插入位置
inject: 'body'
}),
],
};layer.tpl
<div class="layer">
<div> this is a <%= name %> layer </div>
<% for (var i = 0;i < arr.length; i++ ) { %>
<%= arr[i] %>
<% } %>
</div>layer.js
import './layer.less';
import tpl from './layer.tpl';
function layer() {
return {
name: 'layer',
tpl: tpl
};
}
export default layer;
安装html-loader:
https://www.npmjs.com/package/html-loader
npm install html-loader --save-dev
layer.html
<div class="layer"> <div> this is a layer </div> </div>
layer.js
import './layer.less';
import tpl from './layer.html';
function layer() {
return {
name: 'layer',
tpl: tpl
};
}
export default layer;webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
entry: './src/app.js',
output: {
filename: 'js/[name].bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.js$/,
loader: 'babel-loader',
// 排除
exclude: /node_modules/,
query: {
presets: ["@babel/preset-env"]
}
},
{
test: /\.html$/,
loader: 'html-loader'
},
{
test: /\.css$/,
use: [
'style-loader',
// 用来处理css中引入的css
{ loader: 'css-loader', options: { importLoaders: 1 } },
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: [
require('autoprefixer')({
broswers: ['last 5 versions']
}),
]
}
}
]
},
{
test: /\.less$/,
use: [
'style-loader',
// 用来处理css中引入的css
'css-loader',
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: [
require('autoprefixer')({
broswers: ['last 5 versions']
}),
]
}
},
{ loader: 'less-loader'}
]
},
{
test: /\.scss$/,
use: [
'style-loader',
// 用来处理css中引入的css
'css-loader',
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: [
require('autoprefixer')({
broswers: ['last 5 versions']
}),
]
}
},
{ loader: 'sass-loader'}
]
}
]
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
filename: 'index.html',
// html 标题
title: 'this is a.html',
// 使用模板
template: 'index.html',
// script标签插入位置
inject: 'body'
}),
],
};app.js
import './css/common.css';
import Layer from './components/layer/layer.js';
const App = function() {
var dom = document.getElementById('app');
var layer = new Layer();
dom.innerHTML = layer.tpl;
};
new App();index.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>webpack app</title> </head> <body> <div id="app"></div> </body> </html>
html-load处理模板
对模板进行打包:将模板处理成一个字符串赋值给一个对象的某个属性,再返回这个对象,最后通过对象的属性就可调用这个模板
webpack和npm run webpack的区别:前者是webpack默认的基本命令,后者是执行package.json里面的scripts标签。
html-loader可以处理webpack中的HTML模板
1.安装:npm install html-loader --save-dev
2.配置:{ test:/\.html$/, loader:'html-loader' }
3.app.js中引入并初始化:
import './css/common.css';
import Layer from './components/layer/layer.js';
const App = function() {
var dom = document.getElementById('app');
var layer = new Layer();
dom.innerHTML = layer.tpl;
}
new App();
注意事项:
html-webpack-plugin 会和 html-loader冲突,如果引入html-loader 会导致<%=htmlWebpackPlugin.options.title %> 编译不出。
inject: 'body'不能写成head,那样获取不到app这个id,因为<div id='app'></div>是在body中。
编译后不会再 ./dist/index.html中显示,但在浏览器中可以显示。
webpack的tpl模板支持ejs语法,
1.ejs安装:cnpm install ejs-loader --save-dev
2.配置:{ test:/\.tpl$/, loader:'ejs-loader' }
3.写法:
<h1>study hard! my name is <%=name%></h1>
<%for(var i=0;i<arr.length;i++){%>
<%=arr[i]%>
<%}%>
4.传参:dom.innerHTML = layer.tpl({ name:'xiaohe', arr:['oppo','huawei','xiaomi'] });
vue中的render函数可以直接使用jsx语法
webpack4.2可以注入div的代码。
webpack4貌似过滤了使用dom.innerHtml这个方法来注入标签。如果想要完成老师的实验可以按照我说的做。
首先npm i jquery,安装jquery。
然后app.js文件里边,像这样写
import './css/common.css';
import layer from './components/layer/layer';
import $ from 'jquery';
const App = function() {
let $dom = $('#app');
let ly = layer();
$dom.html(ly.tpl);
}
new App();然后运行webpack,就可以插入div了。大家可以试试看