《晋级篇:SPA单页面应用(组件化开发+SASS+ES6)》
在原项目基础上把html语言改成vue或react,进行组件化开发。
1、sass:用sass代替编写css;
2、ES6语法:ES6新增了很多有趣的特性;
3、externals:打包时忽略第三方库,比如说jquery;
4、resolve属性:改变模块的处理方式;
5、UglifyJsPlugin:webpack自带插件,可以对打包js文件进行压缩或美化处理;
6、BannerPlugin:给打包文件头部加上你的签名;
7、open-browser-webpack-plugin:自动打开浏览器插件;
新建一个lesson4文件,做初始化
初始化完之后对应开发文件目录结构如下:
copy以下代码到index.html
<head>
<meta charset="UTF-8" />
<title>webpack-lesson4</title>
</head>
<body>
<header>
<!-- html-loader:用于引入对应资源 -->
${require('./components/header/header.html')}
</header>
<section>
${require('./components/body/body.html')}
</section>
<footer>
${require('./components/footer/footer.html')}
</footer>
<!-- 跟webpack.config.js中的externals属性结合,作用包括:1、打包时会忽略jquery文件;2、可全局调用jquery -->
<script type="text/javascript" src="//cdn.bootcss.com/jquery/3.2.0/jquery.min.js"></script>
</body>
</html>
copy以下代码到header.html
<h1 class="header-title">this is header</h1>
copy以下代码到body.html
<h1 class="body-title">this is body</h1>
<ul class="body-list">
</ul>
copy以下代码到footer.html
<h1 class="footer-title">this is footer</h1>
.header-title{
font-style: italic;
background-color: rgba(100,100,100,0.9);
color: #fff;
copy以下代码到body.scss
copy以下代码到footer.scss
.footer-title{
color: #fff;
background-color: rgba(200,200,200,0.9);
}
copy以下代码到body.js
// 这里不再需要再import或require jquery,在webpack.config.js中新增了externals属性,让jquery可以在webpack整个运行环境中被调用
let element = $("#body-input"),
str = element.html(),
progress = 0,
timer = setInterval(() => {
let current = str.substr(progress, 1);
if (current == '<') {
progress = str.indexOf('>', progress) + 1;
} else {
progress++;
}
element.html(str.substring(0, progress) + (progress && 1 ? '_': ''));
if (progress >= str.length) {
clearInterval(timer);
element.html(str.substring(0, progress));
}
},150);
配置package.json命令行
"scripts": {
"build": "export NODE_ENV=production && node_modules/.bin/webpack"
}
sass-loader用来解析scss文件,它的安装依赖于node-sass
npm install sass-loader node-sass --save-dev
可以将ES6语法转化成能被浏览器识别的ES5,开发js我们就能使用最新的ES6语法了
npm install --save-dev babel-loader babel-core babel-preset-env
copy以下代码到webpack.config.js
copy以下代码到webpack.entry.js
const cssAndJsContext = require.context('./src', true, /\.(js|scss)$/i);
console.log(cssAndJsContext.keys());
// 结果是:["./base.scss","./components/body/body.js","./components/body/body.scss","./components/footer/footer.js","./components/footer/footer.scss","./components/header/header.js","./components/header/header.scss"]
// cssAndJsContext('./base.scss') 相当于 require("./src/base.scss");
cssAndJsContext.keys().forEach((key) => {
cssAndJsContext(key);
});
if (NODE_ENV === 'development') {
const htmlContext = require.context('./src', true, /\.html$/i);
htmlContext.keys().forEach((key) => {
htmlContext(key);
});
}
require.context
的作用是可以把在自己设置的目录下所有符合条件的文件一次性require到webpack运行环境中,它有三个参数:
require.context(directory, useSubdirectories = false, regExp = /^\.\//)
# 它会返回一个webpackContext的函数结果,通过调用返回对象的.keys()方法可以获取检索结果
# directory:设定在哪个目录下检索文件,必须是相对路径
# useSubdirectories:是否在当前目录下的所有子目录进行检索,而不限制只在directory当前目录下检索
# regExp:正则表达式,即检索条件,webpack.entry.js检索条件是所有文件名以.js或.scss结尾的文件,且不区分大小写
运行npm run build
,本地打开index.html,效果如下:
上面提到的require.context()会把在主目录下所有符合条件的文件路径都返回出来,如果要直接在require中使用变量表达式动态引入模块的话,要注意引入格式,先看个例子:
var name = './src/base.scss';
require(name);
在webpack.entry.js中写入以上代码的话,解析会报错且require不到base.scss,如果这样写
var name = 'base';
require('./src/'+name+'.scss');
就能成功require到base.scss文件,这是因为webpack在解析require函数调用时会抽取两个信息:
Directory(指定目录): ./src
只有成功拿到这两个信息之后,webpack才会在指定目录下寻找符合条件的文件。