在前面所有的文章中,我们都是在围绕网页的三部分,结构(HTML)、表现(CSS)、行为(JS)分离的方式来介绍的,传统的前端,就是在html文件中引入css文件和js文件(包含jQuery之类的js库),来实现网页的一部分,通常包括:
这时候前端在WEB项目中,并不涉及太多的业务逻辑,通常代码最后要交给后端来实现与服务器的交互,前端的岗位在项目中一般是面目模糊的,甚至一个前端会同时跟几个项目,在项目组中不被重视,后端往往觉得前端只是项目的附属品,干着简单又费时费力的工作。
新手理解HTML、CSS、javascript之间的关系
但随着web业务日益复杂化,一个Web项目不再是几个网页(WebPage)那么简单,而是一个运行在互联网上的复杂的Web应用(WebApp)了。一个复杂的Web应用,必然需要多人协作完成,前端专注于客户端,后端专注于服务端,前后端通过API交互;
对于负杂的业务,前端与前端的协作在传统时代是一个麻烦事,怎么提高工作效率、怎么维护代码、怎么提高代码质量、怎么迭代升级,传统时代一个前端宁可从头再来,也不愿接手别人的代码,可见这有多困难。
前端工程化指使用软件工程的技术和方法来进行前端项目的开发、维护和管理,前端工程化的引入,让前端开发能脱离对后端项目的依赖,看起来像一个独立的项目。这是一个很大的话题,并没有一个准确的定义。
如前面讲到的ES6的模块化,VUE中的组件,都是前端工程化的表现形式,实现前端工程化涉及到的技术很多。
如开发时要脱离后端,让项目跑起来,需要Nodejs,实现模块化管理和资源管理需要webpack,实现代码版本管理需要Git等等。
无论怎样,提到前端工程化首先要说一说Node.js
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境
,是一个让 JavaScript 运行在服务端的开发平台。
在此之前JavaScript 的宿主环境只有浏览器,如下面的js代码,需要script标签,插入到HTML中才能被浏览器识别,并被其js引擎解释执行
console.log("Hello World");
安装Nodejs只需要根据自己的操作系统,到官网下载安装合适的版本即可,假设把Nodejs安装到了D盘根目录,可以在命令行窗口运行这个代码
服务器可以监听客户端的请求,类似于Apache、Nginx 等搭建HTTP 服务器
var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');
}).listen(8888);
console.log('Server running at http://127.0.0.1:8888/');
把上面面的代码保存到server.js中,在命令行窗口运行,效果见下图
在浏览器中输入提示的网站,页面将会打印出Hello World
说白了Nodejs是Javascript的另一个宿主环境,有了Node之后,js的地位从前端的脚本语言,变成了一门前后端通吃的语言,随着js的版本升级,js将会越来越重要,成为传统后端不得不正视的编程语言。
说到这里,大家可能会产生一个疑问,虽然js可以在服务端运行,但作为前端如果我们不做全栈,与我们又有什么关系呢?不可能我们掌握了js的语法规则就能成为全栈工程师吧?
这是因为我们虽然不做服务器端,但要实现前端工程化需要用到Nodejs的模块和包。
模块
是Node.js 应用程序的基本组成部分,Node.js的模块系统很简单,和ES6模块化思路相同,每个 Node.js 文件都被视为一个独立的模块(包括JS文件,JSON文本文件,二进制模块文件);
和ES6模块化不同的是,Nodejs采用CommonJS模块化规范,提供 exports 和 require 两个对象, exports 是向外公开模块的接口,require是从外部获取模块的接口。
包
用于管理多个模块以及依赖关系,可以对多个模块进行封装,包可以理解为被封装了的模块,包的根目录必须包含package.json文件,package.json文件是CommonJS规范用于描述包的文件。
模块和包是没有本质区别的,两个概念也时常混用。
大名鼎鼎的NPM(Node Package Manager)是随同NodeJS一起安装的包管理工具,NPM本身也是Node.js的一个模块。
NPM的含义有两层,一个是NPM服务器,NPM服务器网址为http://npmjs.org,NPM是 Node 包的标准发布平台,用于 Node 包的发布、传播;
另一个是NPM命令npm CLI,指在命令行窗口或终端使用npm命令来管理node包(模块),开发者可以使用npm命令下载、安装、升级、删除包等。
npm init
初始化一个包的package.json 文件这个命令相当于在当前目录初始化一个node项目(一个node项目相当于一个node模块或者说node包),运行后,会在当前目录下生成一个package.json文件,这个文件定义了该项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。
npm init -y可以跳过选择,快速生成
package.json 文件的部分配置项
npm run XXX
就可以执行这段脚本,如: “start”: “node server.js”, 执行 npm run start 就是运行 “node server.js”。npm install 模块
安装一个依赖包 , 简写 npm i
直接使用 npm install xxx安装的模块是会自动写入 package.json 的依赖 (dependencies),等同于 npm install xxx --save, 如果同时安装多个依赖包用空格隔开;
额外加个参数:
现在我们来新建一个项目,并且本地安装webpack
npm install webpack
"devDependencies": {
"webpack": "^4.44.1"
}
package.json文件中的配置项dependencies指示生产环境依赖的包
package.json文件中的配置项devDependencies指示开发环境依赖的包
生产环境依赖会在项目打包上线时被引入到项目中,而开发环境依赖在只在项目开发时被引入,如上面提到的webpack
本地安装
全局安装
npm run
执行一个自定义脚本的命令npm 可以在项目package.json里面自定义脚本命令,package.json文件中的字段script的每一个属性都是一个自定义的脚本命令。npm 的 scripts 有4个内置的缩写命令:
npm test 等价于 npm run test
npm start 等价于 npm run start
npm restart等价于 npm run restart
npm stop等价于 npm run stop
npm config
管理npm的配置文件npm的配置文件是一个.npmrc文件,并不存放在nodejs的安装目录中
config命令主要包含增、删、改、查几个步骤,config支持以下子命令:
npm config list 显示所有配置设置
npm config set
npm config set registry https://registry.npm.taobao.org
在nodejs的安装目录D: \nodejs下,新建node_global和node_cache两个文件夹,设置node_global为全局模块存放路径,设置node_cache为缓存文件夹。
npm config set prefix "D:\nodejs\node_global"
npm config set cache "D:\nodejs\node_cache"
npm config get
npm config get registry
npm config edit 直接修改配置文件
npm config delete
npm --version
查看npm 当前安装的版本 简写:npm -v
npm uninstall
卸载当前目录下的某个包, 简写npm un
npm update
更新当前目录下的某个包npm docs xxx
查看某个包文档npm list
查看当前目录下安装的所有的包,npm list -g 查看全局安装包路径下的所有包npm --help
可查看所有命令 简写:npm -h
npm help xxx
查看某条命令的详细帮助 ,如:npm help runnpm view xxx version
查看当前包的版本信息,如:npm view webpack versionnpm search
搜索软件包