Less与TypeScript的简单理解与应用,并使用WebPack打包静态页面
既然选择了远方,便只顾风雨兼程 __ HANS许
系列:零基础搭建前后端分离项目
上篇文章我们讲了VsCode的使用以及Node与Npm的使用,并简单的创建了一个Express的简单前端框架项目。那这篇文章我们进阶的使用Less与TypeScript写一个静态的H5页面,并使用WebPack打包成静态页面。
该篇文章讲述的是Less,TypeScript,WebPack的基本使用,并没与涉及到大型项目,讲讲安装,讲讲用法,讲讲配置,毕竟你要知道是一句英语的翻译是什么,才懂得翻译过来得中文是什么意思吧。那最后面我们使用一个VsCode+Less+TypeScripts+WebPack+Vue做的两个页面,一个简单的"知乎日报"小应用作为结束,也作为下篇文章的开篇。下面用到的代码都在GitHub上面。
创建空项目
- 使用
npm创建空项目
在终端界面使用npm init创建,成功后会根目录创建一个package.json的文件。
或者npm init -y这样创建,就直接默认配置生成package.json文件了。
使用Less
Less 是一个Css 预编译器,意思指的是它可以扩展Css语言,添加功能如允许变量(variables),混合(mixins),函数(functions) 和许多其他的技术,让你的Css更具维护性,主题性,扩展性。
安装
使用命令npm install -g less全局安装就可以了,接着可以在有less的文件夹内使用lessc styles.less将styles.less编译成styles.css
安装成功,运行lessc -v就可以看到版本号了

例子
- styles.less
@base: #f938ab; .box-shadow(@style, @c) when (iscolor(@c)) {
-webkit-box-shadow: @style @c;
box-shadow: @style @c;
}
.box-shadow(@style, @alpha: 50%) when (isnumber(@alpha)) {
.box-shadow(@style, rgba(0, 0, 0, @alpha));
}
.box {
color: saturate(@base, 5%);
border-color: lighten(@base, 30%);
div { .box-shadow(0 0 5px, 30%) }
}
- 使用
lessc styles.less > styles.css - styles.css
.box {
color: #fe33ac;
border-color: #fdcdea;
}
.box div {
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}
- styles.less
使用TypeScript
TypeScript是JavaScript的超集并且能够编译输出为纯粹的JavaScript.
安装
使用命令npm install -g typescript全局安装就可以了,接着可以在有typescript的文件夹内使用tsc greeter.ts将styles.less编译成greeter.js
安装成功,运行tsc -v就可以看到版本号了

例子
greeter.ts
function greeter(person: string) {
return "Hello, " + person;
} let user = "Jane User"; document.body.innerHTML = greeter(user);
使用
tsc greeter.tsgreeter.js
function greeter(person) {
return "Hello, " + person;
}
var user = "Jane User";
document.body.innerHTML = greeter(user);
tsconfig.json
上面是直接编译一个文件嘛,那要是要编译整个项目呢,那要怎么办,我们使用了“TS”,那这个项目也就是"TS项目",TS有个规则:如果一个目录下存在一个tsconfig.json文件,那么它意味着这个目录是TypeScript项目的根目录。 tsconfig.json文件中指定了用来编译这个项目的根文件和编译选项。,
也就是说,tsconfig.json文件就是TS项目编译.ts的配置文件。规则
不带任何输入文件的情况下调用tsc,编译器会从当前目录开始去查找tsconfig.json文件,逐级向上搜索父目录。
不带任何输入文件的情况下调用tsc,且使用命令行参数--project(或-p)指定一个包含tsconfig.json文件的目录。
两种方式(文件包括,文件夹包括与不包括)
- 使用"files"属性
"compilerOptions": {
"module": "commonjs",
"noImplicitAny": true,
"removeComments": true,
"preserveConstEnums": true,
"sourceMap": true
},
"files": [
"core.ts",
"sys.ts",
"types.ts",
"scanner.ts",
"parser.ts",
"utilities.ts",
"binder.ts",
"checker.ts",
"emitter.ts",
"program.ts",
"commandLineParser.ts",
"tsc.ts",
"diagnosticInformationMap.generated.ts"
]
}
- 使用"include"和"exclude"属性
"compilerOptions": {
"module": "system",
"noImplicitAny": true,
"removeComments": true,
"preserveConstEnums": true,
"outFile": "../../built/local/tsc.js",
"sourceMap": true
},
"include": [
"src/**/*"
],
"exclude": [
"node_modules",
"**/*.spec.ts"
]
}
- 使用"files"属性
含义(配置项的含义)
截了张图,太长了,大家可以去GitHub下载,或者访问上面的链接。总之,意思就是你在项目里面配置好
tsconfig.json,就能编译整个项目了。
在项目的根目录使用命令tsc -init,就可以在项目创建一个默认的tsconfig.json文件了。
使用WebPack
Webpack 是当下最热门的前端资源模块化管理和打包工具。它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分隔,等到实际需要的时候再异步加载。通过 loader 的转换,任何形式的资源都可以视作模块,比如 CommonJs 模块、 AMD 模块、 ES6 模块、CSS、图片、 JSON、Coffeescript、 LESS 等。
那我们这边讲的是4.0的版本
安装
使用命令npm install --global webpack全局安装,在4.0的版本还需要webpack-cli,使用命令npm install --global webpack-cli。
安装成功,使用命令webpack -v
例子
创建例子目录
- 创建目录

例子目录index.html
<!doctype html>
<html>
<head>
<title>起步</title>
</head>
<body>
<script src="main.js"></script>
</body>
</html>
index.js
document.write("HelleWord")
打包
- 我们使用命令
webpack进行打包。会输出下面的字样。有黄色警告,但是我们“dist”文件夹出现了“main.js”


enter description here- 尝试阅读黄色信息,他告诉我们,webpack打包时是可以配置环境的,然后去官网了解了,4.0的打包分为“开发环境”,“生产环境”,第一个打包不会进行文件的压缩,而“生产环境”。“开发环境”命令:
webpack --mode=development,“生产环境命令”:webpack --mode=production。

enter description here
enter description here- 我们使用命令
预览html,成功执行

enter description here
webpack.config.js
webpack 的配置文件,是导出一个对象的 JavaScript 文件。我们看到别人的很多项目,在项目的根目录都有这个文件。
文件里面配置了各种选项,各种节点,并且是一个JavaScript的对象,可以直接代码拿起来用。打包时的配置已这个文件优先。
看名称我们已经知道文件的含义,就是来配置webpack怎么打包,打包的规则是什么。这个配置文件非常庞大,在这里就不过多的解释了,在以后的文章文针对每个点来写个例子。这边就已一个中文注释的代码结束这话题,大家看到中文就知道每个节点啥含义,有啥用了。那更多就到官网看咯:https://webpack.css88.com
const path = require('path'); //引入node的path模块
const webpack = require('webpack'); //引入的webpack,使用lodash
const HtmlWebpackPlugin = require('html-webpack-plugin') //将html打包
const ExtractTextPlugin = require('extract-text-webpack-plugin') //打包的css拆分,将一部分抽离出来
const CopyWebpackPlugin = require('copy-webpack-plugin')
// console.log(path.resolve(__dirname,'dist')); //物理地址拼接
module.exports = {
entry: './src/index.js', //入口文件 在vue-cli main.js
output: { //webpack如何输出
path: path.resolve(__dirname, 'dist'), //定位,输出文件的目标路径
filename: '[name].js'
},
module: { //模块的相关配置
rules: [ //根据文件的后缀提供一个loader,解析规则
{
test: /\.js$/, //es6 => es5
include: [
path.resolve(__dirname, 'src')
],
// exclude:[], 不匹配选项(优先级高于test和include)
use: 'babel-loader'
},
{
test: /\.less$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: [
'css-loader',
'less-loader'
]
})
},
{ //图片loader
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'file-loader' //根据文件地址加载文件
}
]
}
]
},
resolve: { //解析模块的可选项
// modules: [ ]//模块的查找目录 配置其他的css等文件
extensions: [".js", ".json", ".jsx",".less", ".css"], //用到文件的扩展名
alias: { //模快别名列表
utils: path.resolve(__dirname,'src/utils')
}
},
plugins: [ //插进的引用, 压缩,分离美化
new ExtractTextPlugin('[name].css'), //[name] 默认 也可以自定义name 声明使用
new HtmlWebpackPlugin({ //将模板的头部和尾部添加css和js模板,dist 目录发布到服务器上,项目包。可以直接上线
file: 'index.html', //打造单页面运用 最后运行的不是这个
template: 'src/index.html' //vue-cli放在跟目录下
}),
new CopyWebpackPlugin([ //src下其他的文件直接复制到dist目录下
{ from:'src/assets/favicon.ico',to: 'favicon.ico' }
]),
new webpack.ProvidePlugin({ //引用框架 jquery lodash工具库是很多组件会复用的,省去了import
'_': 'lodash' //引用webpack
})
],
devServer: { //服务于webpack-dev-server 内部封装了一个express
port: '8080',
before(app) {
app.get('/api/test.json', (req, res) => {
res.json({
code: 200,
message: 'Hello World'
})
})
}
}
}
WebPack还有很多需要理解的,比如“模块热替换”,"懒加载"等等,后面有机会再讲。
开始写项目
那接下来我们就是VsCode+Node+Less+TypeScript构建一个简单的应用“知乎日报每天版”
- 介绍
知乎日报API
那先介绍下api,api从网上百度查下就知道了,在这边链接一篇文章,大大已经分析好了,我们就拿过来用就可以了。文章链接:知乎日报API我使用了两个api,一个是获取最新消息,也就是今天的消息,另一个当然是详情啦,根据这两个api,我采用了“Vue”框架(这样就不用自己搭了-_-)来实现,当然技术还是文章标题那些,来构建一个“知乎日报每天版”
每天日报页面

日报详情页面

- 实现
创建项目
首先上面的Less,TypeScript,WebPack都要先安装好。
接着我们安装vue,官方提供了一个“vue cli”,可以根绝这个来快速创建一个Vue的项目,那我们采用的是3.0的版本,3.0才有“TS”的项目,那使用命令
npm install -g @vue/cli,照旧vue -V就可以看到版本号了,若是2.0的,可以先卸载2.0,再重新安装3.0.

使用命令
vue create projectname来创建项目第一个选项是默认,第二个是配置化,我们选择第二个

然后按照我们想要的,选择安装,按“空格键”选中

后面就按“Enter”一直确认了,到了选择样式是,我们选择“Less”,后面就一路默认了。


enter description here创建好的项目

运行项目
使用命令npm run serve,运行项目,http://localhost:8080 就可以看到效果了。

改造项目
App.Vue
那由于我们不需要Home,About的切换了,就注释掉,直接使用" "来显示我们写好的View

添加界面和路由
- 我们添加如下的两个View
可以看到我们css采用的less语法来写的,script采用的ts语法来写的。


enter description here
enter description here- 接下来设置路由

- 我们添加如下的两个View
然后就可以按照上面的来运行项目,进入http://localhost:8080/#/zhihu 就可以看到效果了
使用命令
npm run build,他会直接帮你打包好。然后你在服务器上就可以运行了,无需依赖NodeJs了。

enter description here发现问题
我们发现上面讲的webpack.config.js,在该项目并没有,那时因为Vue Cli3.0集成了在模块里面,并采用默认的配置来构建项目,编译项目,打包项目,这样我们无需搭理了。若是我们有特殊要求了,Vue将配置全部集中来根目录vue.config.js中,我们可在根目录创建该文件,进行配置、具体我们下篇再讲。
那我也做个Express版的,源码都在GitHub,可以上去下载来看看。
总结一下
那这篇文章,对于Less,TS,WebPack并没有去深入讲解,每个点都可以写一篇或者更多,既然系列是零基础,那就是了解个概念,知道是啥,有啥效果就可以了,或许等到真正接触大型项目时,可以深入去了解。那最后也用了一个Vue的项目来演示Less与Ts,并采用Vue自带WebPack来打包前端。无需再配置啥,真正做到你生成项目就可以在开始做,只要你有前端的基础知识。
Less与TypeScript的简单理解与应用,并使用WebPack打包静态页面的更多相关文章
- git的简单理解及基础操作命令
前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
- [转]简单理解Socket
简单理解Socket 转自 http://www.cnblogs.com/dolphinX/p/3460545.html 题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公 ...
- Js 职责链模式 简单理解
js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...
- Deep learning:四十六(DropConnect简单理解)
和maxout(maxout简单理解)一样,DropConnect也是在ICML2013上发表的,同样也是为了提高Deep Network的泛化能力的,两者都号称是对Dropout(Dropout简单 ...
- Deep learning:四十二(Denoise Autoencoder简单理解)
前言: 当采用无监督的方法分层预训练深度网络的权值时,为了学习到较鲁棒的特征,可以在网络的可视层(即数据的输入层)引入随机噪声,这种方法称为Denoise Autoencoder(简称dAE),由Be ...
- 简单理解dropout
dropout是CNN(卷积神经网络)中的一个trick,能防止过拟合. 关于dropout的详细内容,还是看论文原文好了: Hinton, G. E., et al. (2012). "I ...
- 我们为之奋斗过的C#-----C#的一个简单理解
我们首先来简单叙述一下什么是.NET,以及C#的一个简单理解和他们俩的一个区别. 1 .NET概述 .NET是Microsoft.NET的简称,是基于Windows平台的一种技术.它包含了能在.NET ...
- 简单理解ECMAScript2015中的箭头函数新特性
箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...
随机推荐
- SpringCloud学习系列之六 ----- 路由网关Zuul基础使用教程
前言 在上篇中介绍了SpringCloud Config的完美使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由网关 ...
- C#相等性 - 三个方法和一个接口
简介 C#(.NET)的object类里面有三个关于判断相等性的方法: public virtual bool Equals(object obj) public static bool Equals ...
- samba 基本配置及自定义控制
Samba简介: Samba实现的是Linux和Windows之间的一种共享,为两种不同的操作系统架起了一座桥梁,使Linux系统和Windows系统之间能够实现互相通信,共享文件系统.打印机及其他资 ...
- python中线程和进程(二)
目录 线程同步 Event Lock RLock Condition Barrier semaphore GIL 线程同步 线程同步,即线程之间协同工作,一个线程访问某些数据时,其他线程不能访问这些数 ...
- 生产环境一键创建kafka集群
前段时间公司的一个kafka集群出现了故障,由于之前准备不足,当时处理的比较慌乱.如:由于kafka的集群里topic数量较多,并且每个topic的分区数量和副本数量都不是一样的,如果按部就班的一个一 ...
- MES是什么,MOM是什么?
MES简介 MES(Manufacturing Execution System)制造执行系统,用于制造业车间级的信息化管理系统.单说MES系统这个概念比较广泛,大致分为以下几个方面:计划调度.生产. ...
- Error:Execution failed for task ':app:processDebugManifest'.
Attribute meta-data#android.support.VERSION@value value=(26.1.0) from AndroidManifest.xml:28:13-35 i ...
- CentOS_关机与重启命令详解
Linux centos关机与重启命令详解 Linux centos重启命令: 1.reboot 2.shutdown -r now 立刻重启(root用户使用) 3.shutdown -r 10 过 ...
- python+selenium 自动化测试实战
一.前言: 之前的文章说过, 要写一篇自动化实战的文章, 这段时间比较忙再加回家过11一直没有更新博客,今天整理一下实战项目的代码共大家学习.(注:项目是针对我们公司内部系统的测试,只能内部网络访问, ...
- JavaScript 中的四舍五入
在 JavaScript 中,对数值进行四舍五入操作的场景有以下几种: 向上取整:ceil 向下取整:floor 四舍五入:round 固定精度:toFixed 固定长度:toPrecision 取整 ...