写在前面

前言

最近这些年前端相关的技术的发展速度犹如坐上了火箭一般一日千里,新技术新框架层出不穷:Node.js、React、Angular、Vue... 端上有React Native、node-webkit,JavaScript竟然隐约有一统前端、后端、移动端、PC端之势...
不过与其说进击的JavaScript,我更觉得不如说天下技术本一家。就像“前端开发”“后端开发”“客户端开发”等各种开发之间并没有那么大的区别、只是对技术的细分,不同的编程语言、工具也都是在朝着高性能、可复用、开发友好的方向前进。JavaScript也是在朝着这个方向前进,良好的生态和无数开发人员的努力使得它迎来了百花齐放的今天。

写这篇文章的原因

这几年作为“Java后端开发”的我其实做Windows C++客户端开发的时间和写Java后端的时间几乎是五五开(对,开挂般的工种...),前端技术其实以前也是我的心头爱,不过这几年算是荒废了,只能看着前端同学的IDE流口水再厚着脸皮问“这几行代码是什么意思啊?”,前端GG心情好还会耐心解释一番、要是心情不好就只能接收到“说了你也不懂”的眼神了...
最近终于有些时间,可以系统地学习梳理一遍前端知识了,这篇文章既是学习成果的自我总结,也希望能对有兴趣的同学有所裨益,由于我本身也还只是个前端菜鸟,文章如果有错误或不当之处还望大家斧正。

面向的对象

如前面所说,这篇文章分享给有兴趣的、对前端技术不太熟悉的同学。但你应该至少掌握了以下基础知识(否则需要先充下电了哦):

  • HTML,至少得能手写个html、header、body吧。
  • CSS,我知道大家都烦这个、下面我也不会说它的,但你至少应该知道怎么在html中插入/引用css吧,再给body设置个背景色试试?
  • JavaScript,我指的是最基础的,比如知道怎样在html中插入/引用JavaScript,能看懂"document.getElementById('demo').innerHTML='Hello JavaScript'; "这行代码。
  • 表单提交与Ajax,是不是就是一个刷新一个不刷新?... 但你至少应该能用JavaScript写出Ajax提交数据的Demo来。

如果你能熟练使用jQuery、Bootstrap,那么恭喜你,作为一个上古时代的前端高手,我相信你可以无障碍地阅读下面的内容!

参考资料

下面是相关的参考资料,本文充其量只是一个速成教程,真正的精华都在下面:

  • JavaScript 标准参考教程 ,阮一峰老师著。
  • ECMAScript 6 入门,还是阮一峰老师著,此书有纸质版可以支持下哦。
  • MDN JavaScript 参考文档,Mozilla的JavaScript参考文档,信Firefox、得永生。

下文中还直接使用了很多阮一峰老师著作中的内容,有些不成段落的语句可能没有标记成引用还望谅解。

基础:JavaScript有些不一样了

JavaScript的核心语法部分相当精简,只包括两个部分:基本的语法构造(比如操作符、控制结构、语句)和标准库(就是一系列具有各种功能的对象比如Array、Date、Math等)。
不同的运行环境(如浏览器、Node.js)也会提供额外的API供JavaScript调用,以浏览器为例,它提供的额外API可以分成三大类:

  • 浏览器控制类:操作浏览器,如window.open()
  • DOM 类:操作网页的各种元素,如getElementById()
  • Web 类:实现互联网的各种功能,如XMLHttpRequest

这一部分只介绍JavaScript的核心语法,示例代码基本上都可以在Chrome或其它浏览器的开发者工具的Console中执行。

ECMAScript与JavaScript

1996 年 11 月,JavaScript 的创造者 Netscape 公司,决定将 JavaScript 提交给国际标准化组织 ECMA,希望这种语言能够成为国际标准。次年,ECMA 发布 262 号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript,这个版本就是 1.0 版。
阮一峰:《ECMAScript 6 入门》

简而言之,ECMAScript是标准,JavaScript是其实现(另外的ECMAScript方言还有Jscript和ActionScript)。
这好比Java标准也由JCP(Java Community Process)在维护,因此既有Oracle JDK,还有OpenJDK、IBM JDK。

ECMAScript 6(下述简称ES6)

由于时间跨度、浏览器兼容性等原因,这篇文章将以2015年正式发布ECMAScript 6标准(也即ECMAScript 2015)作为基础。与“上古时代”的JavaScript(ECMAScript 5于2009年发布)相比,ECMAScript 6加入了众多的新特性,我认为这也是这些年JavaScript腾飞的基础之一。
自ECMAScript 6开始ECMAScript将每年发布一个版本,ECMAScript 2016、2017也已在当年发布,不过其跨度不大、改变也不算多,有兴趣的同学可以自行学习。

这么看来ECMAScript 6的意义相当于C++11,同样是时隔多年(C++11之前的一个标准是C++03...),同样是堪称大刀阔斧地“重新定义”...

哪里不一样

let:你还在用"var"吗?

ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
阮一峰:《ECMAScript 6 入门》

如下所示,"let"只在其所在的大括号范围内有效,可以视为“局部变量”。

{let a = 10;var b = 1;
}a // ReferenceError: a is not defined.
b // 1

另外不同于在Scala、Swift中"let"用来表示不变量(不要跟ES6记混了哦),ES6还是很常规地引入了"const"来表示常量:

const PI = 3.1415;PI = 3;

解构赋值:我连赋值都快看不懂了

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
阮一峰:《ECMAScript 6 入门》

先看数组的解构,还是很简单的:

let [a, b, c] = [1, 2, 3];
a //1
b //2
c //3

再看对象解构并赋值到变量,初看也比较简单:

let { foo, bar } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"

但如果变量名与属性名不一致,必须写成下面这样:

let { foo: baz } = { foo: "aaa", bar: "bbb" };
baz // "aaa"
foo // error: foo is not defined

上面代码中,foo是匹配的模式,baz才是变量。真正被赋值的是变量baz,而不是模式foo。你记住了吗?

Class:终于有正宫对象了

在ES6之前,生成实例对象的方法是通过构造函数。下面就是这样一个反人类的例子。

function Point(x, y) {this.x = x;this.y = y;
}Point.prototype.toString = function () {return '(' + this.x + ', ' + this.y + ')';
};var p = new Point(1, 2);

是的,ES6英雄般地又一次拯救了我们的脑细胞,请看下面的例子!没错,那个constructor函数代表了类的构造方法(也可以不显式定义哦)。

//定义类
class Point {constructor(x, y) {this.x = x;this.y = y;}toString() {return '(' + this.x + ', ' + this.y + ')';}}var point = new Point(2, 3);
point.toString();

Proxy、Reflect:动态代理和反射不只Java有哦

不多说,直接上代码,先看Proxy的例子,Proxy支持的拦截操作共13种,这里只展示它拦截get的操作。

let person = {name: "张三"
};let proxy = new Proxy(person, {get: function(target, property) {if (property === 'name') {return "李四";} else {return "你猜";}}
});person.name // "张三"
proxy.name // "李四"
proxy.age  // "你猜"

再看Reflect的,与Proxy对应、它也有13种方法,这里也只展示对get的反射。

var myObject = {foo: 1,bar: 2,get baz() {return this.foo + this.bar;},
}Reflect.get(myObject, 'foo') // 1
Reflect.get(myObject, 'bar') // 2
Reflect.get(myObject, 'baz') // 3

lambda:请叫我“箭头函数”

作为这几年的大热门,lambda不出意外地也被加入到了ES6中,不过它的正式名称是Arrow Functions即箭头函数。其示例如下。

//箭头函数
var sum = (num1, num2) => num1 + num2;// 等同于
var sum = function(num1, num2) {return num1 + num2;
};

有没有发现这个箭头(=>)是用等号写的箭头,不同于Java里面那个横线箭头(->)?让我们来复习下不同语言中的lambda表达式吧:

[](int a) -> bool { return a > 0; }  // C++,此例可以省略箭头和"bool"返回值类型声明
a -> a > 0  // Java
a => a > 0  // C#
a => a > 0;  //JavaScript
lambda a: a > 0  # Python
(lambda (a) (> a 0))  ;; Lisp

Promise:异步编程你怕不怕

Promise是ES6中提出的异步编程的一个解决方案,Java中与之接近的概念是Future(你也可以用Future来实现Promise机制,在Scala、Netty中也实现了Promise机制)。但也只能是接近,因为JavaScript语言本身是单线程的(不讨论Web Worker)、永不阻塞的、基于事件循环模型(Event Loop)的,用单纯Java的思想会很难理解下面这段代码的执行结果为什么是“2 1”:

setTimeout(function(){console.log(1);}, 0);
console.log(2);

言归正传,ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。下面代码创造了一个Promise实例。

const promise = new Promise(function(resolve, reject) {// ... some codeif (/* 异步操作成功 */){resolve(value);} else {reject(error);}
});

你可能会问“resolve”、“reject”是什么?可以说它们代表了“当异步操作成功时的回调函数”、“当异步操作失败时的回调函数”,它们现在还未定义,它们会在后面由你在“.then”方法中传入

先看一个简单的例子,这里在then方法中只传入了resolve函数,未传入reject回调函数。

let promise = new Promise(function(resolve, reject) {console.log('Promise');resolve();
});promise.then(function() {console.log('resolved.');
});console.log('Hi!');// Promise
// Hi!
// resolved

再看一个Ajax的例子,好好理解下哦。

const getJSON = function(url) {const promise = new Promise(function(resolve, reject){const handler = function() {if (this.readyState !== 4) {return;}if (this.status === 200) {resolve(this.response);} else {reject(new Error(this.statusText));}};const client = new XMLHttpRequest();client.open("GET", url);client.onreadystatechange = handler;client.responseType = "json";client.setRequestHeader("Accept", "application/json");client.send();});return promise;
};getJSON("/posts.json").then(function(json) {console.log('Contents: ' + json);
}, function(error) {console.error('出错了', error);
});

Module:官方模块化,远离CommonJs/AMD/CMD保平安!

历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。
阮一峰:《ECMAScript 6 入门》

简单地说,Java有import、Python有import、C++有#include,可JavaScript一直没法“引用”别的js文件。在此背景下,出现了:

  • CommonJs规范,用于服务端,Node.js的require是其实现。
  • AMD(Asynchronous Module Definition)规范,用于浏览器环境,RequireJS是其实现。
  • CMD(Common Module Definition)规范,由玉伯老师提出,用于浏览器环境,Sea.js是其实现。

怎么样,头晕了没?还好自从有了ES6,生命里都是奇迹... ES6在语言层面实现了模块功能,完全可以一统服务端和客户端取代CommonJs/AMD/CMD,我们可以告别那个八仙过海各显神通的时代了,感谢ES6为我们的防脱发事业做出的卓越贡献!

上面纯属玩笑,无论如何,我们都要感谢为了JavaScript模块化标准做出过贡献的各位大神,他们的探索无疑为ECMAScript的模块化标准做出了不可磨灭的贡献!

言归正传,现在最新的主流浏览器都已经支持ES Module,Node.js也开始支持ES Module标准,我们现在可以只学习ES6的Module了,不用再关注CommonJs/AMD/CMD等之前的规范。
让我们先在profile.js中用export来导出一组变量,注意除此之外还可以导出函数和类:

// profile.js
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;export {firstName, lastName, year};

再在main.js中用import来导入它们:

// main.js
import {firstName, lastName, year} from './profile';function setName(element) {element.textContent = firstName + ' ' + lastName;
}

是不是很简单呢?

其它:数组的map、reduce你造吗?(ECMAScript 5.1)

这两个数组的方法是早就在2011年发布的ECMAScript 5.1中就发布的,但我觉得还是有必要提一下的。它们的作用也相当于Java8的Stream API中的map和reduce(及collect),示例如下:

// map示例
let numbers = [1, 5, 10, 15];
let doubles = numbers.map( x => x ** 2);// doubles is now [1, 25, 100, 225]
// numbers is still [1, 5, 10, 15]//reduce示例,后面那个"0"表示给sum的初始值
var total = [0, 1, 2, 3].reduce(function(sum, currentValue) {return sum + currentValue;
}, 0);// total is 6

你应该有注意到在上面的map示例中使用了箭头函数,如果你找茬能力强力的话,应该发现了当数组的map、reduce方法发布时,那时还没有箭头函数呢!
那么问题来了,在没有箭头函数的时候,map、reduce是怎么用的呢? 答案很简单,当年用的是普通的回调函数:

var numbers = [1, 5, 10, 15];
var doubles = numbers.map(function(value){return value ** 2;});// doubles is now [1, 25, 100, 225]
// numbers is still [1, 5, 10, 15]

Node.js:前端开挂的起点

简介

Node.js是一个JavaScript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。

简单地说,Node.js是在浏览器之外的一个JavaScript运行时,在安装了Node.js之后,你就可以在命令行中执行JS了:

echo "console.log('Hello Node.js!');" > index.js
node index.js//Hello Node.js!

与浏览器一样,Node.js也为JavaScript提供了大量的额外API,如 fs(文件系统)、net(网络)、os(操作系统)等等。可以说在Node.js的加持下,JavaScript拥有了类似于Python的能力。

安装

如何安装Node.js就不详述了,Mac下可以使用brew安装,Windows下也有安装包。
注意我安装的node已经是v9.3.0了,此章的Demo是以该版本为基本的。

npm

如果还是要类比的话,npm类似于Java体系中的Maven,负责进行包管理。
有个不同之处在于Node.js已经自带了npm,不需要再额外安装了。

开始之前

在使用之前,可以先做件事情,将npm的切换到淘宝镜像,可以有效地解决下载包太慢的问题:

npm config set registry " https://registry.npm.taobao.org"

全局安装和本地安装

在使用"npm install xxx"命令时(这里xxx仅为示例),可以有一个"-g"的参数,它表示将xxx安装到全局目录(我这是/usr/local/lib/node_modules)下,同时用"which xxx"命令可以发现在"/usr/local/bin"下面已经有了一个xxx的软链接,这样我们就可以在任何目录下执行tnpm命令了。

如果不加"-g"呢? 那包就会被安装到当前目录的"node_modules"目录下,记住这一点,下面我们的Demo马上就要用到。

package.json

如果说npm类似于Maven,那么package.json就是pom.xml了,里面同样记录了项目信息及依赖。

用Node.js写一个Web服务器

有了上面这些知识之后,我们马上就可以开始实现一个Web服务器,目前使用Node.js下比较广泛的Web框架是Express,好比Python里面的Django。

1.创建一个项目文件夹

你一定不想把你的home目录弄乱是吧?

mkdir ExpressStarter
cd ExpressStarter

2.初始化项目

用npm init可以直接创建模块,生成package.json,npm会询问你包名、版本、入口点、Git仓库之类的,直接回车可以使用默认值,但在此Demo中入口点(entry point)请使用"index.mjs",后面我会说原因的。

npm init
package name: (expressstarter) com.spirit.test
version: (1.0.0)
description:
entry point: (index.js) index.mjs
test command:
git repository:
keywords:
author:
license: (ISC)

此时的package.json内容如下:

{"name": "com.spirit.test","version": "1.0.0","description": "","main": "index.mjs","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "","license": "ISC"
}

3.安装express并写入package.json依赖

用一行命令就可以搞定了:

npm install --save express

没错,这行命令的意思就是在当前目录的"node_modules"下安装express(及其所有依赖),并将express依赖写到package.json中去,是不是很方便?

此时的package.json的内容如下,express前面那个"^"相信你能猜到是什么意思:

{"name": "com.spirit.test","version": "1.0.0","description": "","main": "index.mjs","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "","license": "ISC","dependencies": {"express": "^4.16.2"}
}

4.编写index.mjs

接下来就可以开始搬砖了,请在ExpressStarter文件夹下创建index.mjs文件,再掏出你最爱的IDE/编辑器,把下面的代码放进去。Demo代码仅仅11行,相信不用解释你也能看懂。

import express from 'express'let app = express();app.get('/', function (req, res) {res.send('Hello World!');
});app.listen(3000, function(){console.log('Example app listening on port 3000!');
});

5.运行Demo

使用下述命令即可运行我们的Demo:

node --experimental-modules index.mjs

如果你看到了"Example app listening on port 3000!"这行提示,那么马上打开浏览器访问"http://127.0.0.1:3000/" 看看效果吧!

你应该注意到了"--experimental-modules"这个参数,它跟我们使用".mjs"的文件名后缀的原因一样:因为Node.js之前使用CommonJs规范,在引用其它模块是使用的是"require"关键字,这里我们直接使用了ES6的"import",所以需要开启这项目前还是实验性的功能,而为了与以前保持兼容、使用ES6 Module规范的模块都需要使用".mjs"作为后缀名。

6.其它说明

Demo到这里就演示结束了,你心里可能有些疑惑,但如果想要深入钻研就要靠你自己了。

但可以多说一些的是,在常规项目中,"node_modules"文件夹是要被加入到.gitignore里面去的、不要把它一起提交到git上去,其他同学在clone该项目后,直接在项目文件夹下执行"npm install"就可以把依赖下载到"node_modules"文件夹里面了。
而且在package.json的"scripts"中可以加入编译、清理之类的命令,其作用大致相当于mvn compile、mvn clean。

React

先告诉大家一个不幸的消息:
上面的内容其实还只介绍了JavaScript语法、Node.js及项目基本结构,还有一个用Node.js开发Web服务的Demo,可以说跟“前端开发”还没有半毛钱的关系。

但是!Node.js、npm、package.json是现代前端工程的基石,我们需要它们来完成对前端工程的构建(包括“编译”、打包、测试等等)。

下面我们先来学习大名鼎鼎的React,并以此为出发点来学习各种前端构建工具。

简介

React是起源于Facebook的一个前端框架,虚拟DOM技术是其基石。React提出了JSX语法,而组件化是其核心思想。

以“传统”的方式将React引入页面

先抛开Node.js那些东西,让我们以传统的方式在在页面中引入React。你可以将下面的html代码拷贝下来放到一个htm文件里面去,再用浏览器打开看看效果。

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>React</title><script src="https://cdn.bootcss.com/react/15.4.2/react.min.js"></script><script src="https://cdn.bootcss.com/react/15.4.2/react-dom.min.js"></script><script src="https://cdn.bootcss.com/babel-standalone/6.22.1/babel.min.js"></script>
</head>
<body><div id="root"></div>
<script type="text/babel">
ReactDOM.render(<h1>Hello, world!</h1>,document.getElementById('root')
);
</script>
</body>
</html>

来看html中的那段JavaScript, "<h1>Hello, world!</h1>"是什么? 它不是字符串,因为没有引号,很明显它也不像是一个“正常的对象”。 这就是React独有的JSX语法,是React创建虚拟DOM的一种方式,这个h1标签在稍后会被“编译”(或称翻译)为一个真正的JavaScript对象。

可以发生html中的那个script标签的type是"text/babel"、而常规的JavaScript的type是"text/javascript",这是为什么? 这是因为JSX语法很明显和JavaScript是不兼容的,所以用到了JSX的地方都声明为"text/babel"。

那babel又是什么?Babel是一个JavaScript“编译器”,它可以使用了ES6特性的JavaScript代码编译为符合ES 5.1标准的代码,也可以将JSX语法编译为符合JavaScript语法的代码,这里我们就是使用它来编译了含JSX的代码。

需要注意的是,在实际情况下编译这一步是预先完成的、而不是像本Demo这样在客户端加载babel来完成,在Chrome的控制台中你也可以看到Babel输出的警告,不过这一章我们只讲“传统”方式,先不讲构建。

Component-组件

React中的组件是其基本设计思想,通过组件与JSX的组合,更是可以发挥出无穷的威力。那接下来就把Demo改造成一个使用组件完成试试,这里只展示JavaScript代码了:

<script type="text/babel">
class HelloMessage extends React.Component {render() {return <h1>Hello, {this.props.name}</h1>;}
}ReactDOM.render(<HelloMessage name="Spirit" />,document.getElementById('root')
);
</script>

HelloMessage类中的render()方法就好比各种GUI库里面的paint方法,在界面需要绘制时会被调用。
那props怎么来的? 在此例中,React会将{name:"Spirit"}作为props传给HelloMessage组件。

State

React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。
简单地说,每个组件除开有props属性外,还有一个state属性,当state发生改变时,会触发组件的render()方法。
所以我们再来继续修改Demo,实现在点击时切换内容显示。

<script type="text/babel">
class HelloMessage extends React.Component {constructor(props) {super(props);/** 如果不写这行在下面的handleClick方法中获取到的this指针将是undifined。* 具体原因可以看阮一峰老师的《ECMAScript 6 入门》。*/this.handleClick = this.handleClick.bind(this);this.state = {liked: false};}handleClick() {this.setState({liked: !this.state.liked});}render() {let text = this.state.liked ? 'like' : "don't like"return <h1 onClick={this.handleClick}>Hello, I {text} {this.props.name}</h1>;}
}ReactDOM.render(<HelloMessage name="Spirit" />,document.getElementById('root')
);
</script>

在此例中,我们实现了构建方法并显式地接收了props,还调用了super方法(与Java一样,这应该是构建方法中的第一行代码),并设置了state对象的值,当组件被点击时、state会被改变、render方法也会被再次调用。
其中的"onClick"是JSX的语法,与传统的HTML写法有所不同,具体的知识需要详细学习JSX语法及事件相关的知识。

前端构建

在上一章我们学习了React的基础知识,但我们都知道现在前端js与我们的html页面是分离的,而且前端发布时一般都需要先进行构建,那么前端构建又是怎么回事呢? 让我们继续用上面的Demo来管窥一番吧。

Gulp

Gulp是现在流行的前端构建工具,其作用类似于Java体系中的Maven...等等,之前不是说npm也相当于Maven吗,为什么要使用Gulp而不直接使用npm scripts? 按我的理解,npm scripts更通用更灵活更底层,而Gulp更适合应对前端资源构建。

接下来我们就一步一步地搭建构建环境,来构建上一章的那个React Demo。

1.初始化项目

很常规地,创建文件夹,npm init即可。

mkdir ReactStarter
cd ReactStarter
npm init

2.安装react依赖

通过npm安装react、react-dom的Node.js包

npm install --save react react-dom

3.码代码

在项目目录下创建"index.htm"文件,其内容如下:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>React</title>
</head>
<body><div id="root"></div><script src="build/bundle.js"></script>
</body>
</html>

在项目目录下创建"src"目录,在其下新建"index.js"文件,内容如下:

import React from 'react';
import ReactDOM from 'react-dom';class HelloMessage extends React.Component {constructor(props) {super(props);/** 如果不写这行在下面的handleClick方法中获取到的this指针将是undifined。* 具体原因可以看阮一峰老师的《ECMAScript 6 入门》。*/this.handleClick = this.handleClick.bind(this);this.state = {liked: false};}handleClick() {this.setState({liked: !this.state.liked});}render() {let text = this.state.liked ? 'like' : "don't like"return <h1 onClick={this.handleClick}>Hello, I {text} {this.props.name}</h1>;}
}ReactDOM.render(<HelloMessage name="Spirit" />,document.getElementById('root')
);

4.配置Babel

前面有提到,JSX语法不是JavaScript标准、ES6也不一定是所有浏览器都兼容的,我们需要使用Babel来进行“编译”。

首先是通过npm安装Babel及React、ES2015(即ES6)插件,注意指令是"--save-dev",将它们安装为开发依赖。

npm install --save-dev babel-cli babel-preset-react babel-preset-es2015

然后在项目目录下新建".babelrc"文件,这是Babel的配置文件,其内容如下:

{"presets": ["react","es2015"],"plugins": []
}

5.配置Gulp

同样地,先安装Gulp及其Babel插件到开发依赖中去:

npm install --save-dev gulp gulp-babel

然后在项目目录下新建"gulpfile.js"文件,这是Gulp的配置文件,其内容如下所示,注意下这里仍然使用Node.js的"require"而不是"import"。

const gulp = require('gulp');
const babel = require('gulp-babel');gulp.task('default', function() {// 将你的默认的任务代码放在这gulp.src(['src/*.js']).pipe(babel()).pipe(gulp.dest('build'));
});

好了,Gulp和Babel都配置好了,在项目目录下执行下"gulp"命令构建一下试试。
在build目录下我们找到了"index.js",用编辑器打开其内容,可以发现原来的JSX语法和ES6语法确实被“编译”了,但却是被编译为了Node.js的语法,如"require",React也还是作为一个Node.js依赖没有被编译到一起,这样的编译结果无法在浏览器中正常使用,那要怎么办呢?

6.配置Webpack

Webpack是一个前端资源打包工具,它能够对模块的依赖关系进行分析,并将这些资源都打包成可在浏览器上运行的形式。

同样,先安装Webpack的依赖:

npm install --save-dev gulp-webpack

再来修改下gulpfile.js,加上Webpack的流程:

const gulp = require('gulp');
const babel = require('gulp-babel');
const webpack = require('gulp-webpack');gulp.task('default', function() {// 将你的默认的任务代码放在这gulp.src(['src/*.js']).pipe(babel()).pipe(gulp.dest('build')).pipe(webpack({output:{filename:'bundle.js'}})).pipe(gulp.dest('build'));
});

再执行"gulp"命令,"build"目录下会生成"bundle.js",其中的内容整合了"index.js"及其所有依赖。
现在打开项目目录下的"index.htm",页面应该是运行正常的,这下我们实现了一个初具雏形的前端构建环境。

7.善后工作

此时可以再修改一个"package.json",去掉里面的"main"这项,再往"script"中加入"build"脚本:

"scripts": {"build": "gulp"
}

这样当执行"npm run build"命令时,实际上也是启动了gulp进行构建工作。

总结

需要注意的是,这个构建的Demo配置得比较简单,代码没有压缩、混淆,也没有去除注释,如果你在代码里面写了什么不够友善的注释、在单量之类的数据上用了随机数,小心被用户一眼就看出来了哦。

实际的前端工程配置会比这复杂不少,各个BU、各个前端团队目前应该也有不同的构建工具及配置,革命尚未成功,同志仍需继续学习!

后记

这篇文章只是我作为一个前端菜鸟、浅尝辄止地学习了一下前端相关的部分知识后的一个总结,相信既不全面、也会有不少错误之处,发出来一是希望能给同样对前端技术感兴趣的同学一点参考,也是希望能接受到大家的指导。
前端技术仍在飞速发展,想要真正的做到有些理解和感悟,还得不断地学习与练习,学而时习之,不亦说乎?

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 双眼皮割内双

    ...

    2024/4/21 15:09:49
  2. 句柄和伪句柄

    句柄的由来:从Visual C++的头文件来看,HANDLE被typedef为void的指针,那是指向未确定数据结构的指针:typedef void* HANDLE;但是这并不说明任何问题,因为句柄远远不只是指向任意数据类型的指针。它是指向数据对象指针的指针。句柄的使用来源于早期的Windows,当时它只能在有…...

    2024/4/30 18:54:01
  3. 对抗AngularJS执行控制器两次

    本文翻译自&#xff1a;Combating AngularJS executing controller twiceI understand AngularJS runs through some code twice, sometimes even more, like $watch events, constantly checking model states etc. 我了解AngularJS会在某些代码中运行两次&#xff0c;有时甚至…...

    2024/5/1 0:50:34
  4. 割完双眼皮 越来越窄

    ...

    2024/4/30 16:39:52
  5. 日式无痕双眼皮恢复图

    ...

    2024/4/21 15:09:47
  6. jq中each和js中forEach的区别

    总结&#xff1a;1.在遍历数组时&#xff1a;回调函数中参数的位置不一样&#xff0c;forEach中为第一个参数为ele&#xff0c;第二个为index。each中第一个为index&#xff0c;第二个为ele&#xff1b;回调函数中是否有返回值&#xff0c;forEach中没有返回值&#xff0c;each…...

    2024/4/20 15:04:28
  7. 有人眼睛瘦割微创双眼皮一宽一窄怎么修复

    ...

    2024/4/20 15:04:27
  8. 做完双眼皮后眼睛变窄

    ...

    2024/4/20 7:20:15
  9. 爱思特双眼皮吧

    ...

    2024/4/20 15:04:25
  10. 双眼皮宽变窄修复难吗

    ...

    2024/4/21 15:09:45
  11. 韩式双眼皮改窄可以吗

    ...

    2024/4/21 15:09:44
  12. 随州一医院割随州哪里可以做割双眼皮拆线后还会肿吗

    ...

    2024/4/21 15:09:43
  13. 南京哪个三甲医院做双眼皮好

    ...

    2024/4/21 15:09:41
  14. 获取线程句柄的三种方法

    获取线程句柄的三种方法 1.通过进程的PID并调用API函数:HANDLE OpenProcess(DWORD dwDesiredAccess, // access flagBOOL bInheritHandle, // handle inheritance optionDWORD dwProcessId // process identifier );HANDLE OpenThread(DWORD dwDesiredAccess, // …...

    2024/4/21 15:09:41
  15. 【Vue】前端规范及工程化

    关于前端规范及工程化的分享,具体按自己实际需求而定 Github 1.前端规范 1.1工作流规范 1.1.1 版本号规范 主版本号&#xff1a;当你做了不兼容的 API 修改&#xff0c;次版本号&#xff1a;当你做了向下兼容的功能性新增&#xff0c;修订号&#xff1a;当你做了向下兼容的…...

    2024/4/21 15:09:40
  16. React 还是 Vue:你该如何选择?

    本文译自React or Vue: Which Javascript UI Library Should You Be Using?&#xff0c;原文需翻墙。 2016年React巩固了它作为前端框架之王的地位&#xff0c;这一年中可以看到它在Web端和移动端的快速成长&#xff0c;同时稳稳领先于它的主要竞争对手Angular。 但是2016对V…...

    2024/4/21 15:09:38
  17. C++函数举例:获取当前模块句柄

    当前模块的句柄在程序进入点可以获得,一般做法是保存为一个全局变量,以后使用这个全局变量即可。但有时在写一些比较通用的代码时刚好要用到模块句柄,如果还去访问这个全局变量就破坏了代码的通用性。下面函数可以取得当前模块的句柄,无须保存,随调随得:01./* 02. 通…...

    2024/4/21 15:09:37
  18. 初识Vue框架

    初识Vue框架 今天初学Vue框架 对Vue框架有了一些简单的认知 下面是一些 Vue常用的单词写法 以及 简单的释义 Integrated集成Development开发Environment环境 MVC—Model模型View视图 Controller控制器 MVP—Model模型View视图Presenter逻辑 MVVM—Model模型View视图ViewModel视…...

    2024/4/21 15:09:36
  19. vue学习与实战

    vue学习与实战 文章目录vue学习与实战第一章 前端核心分析1.1概述1.2 复习前端准备知识1.3 三端统一1.4 后端技术1.5 主流前端框架1.5.1 Vue.js1.5.2 iView1.5.3 ElementUI1.6 前后端分离端第二章 初学Vue2.1 第一个Vue程序2.2 Vue基本语法2.3 V-bind2.4 v-if2.5 787原则2.6 Vu…...

    2024/4/21 15:09:36
  20. 做双眼皮需要住院吗

    ...

    2024/4/21 15:09:34

最新文章

  1. C语言(操作符)1

    Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…...

    2024/5/1 3:22:57
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Linux下的链接文件

    目录 Linux下的链接文件 一、Linux下的链接文件 二、创建链接文件的命令 三、硬链接 四、符号链接(软链接&#xff09; Linux下的链接文件 一、Linux下的链接文件 linux下有两种链接文件&#xff1a;硬链接文件和软链接文件。其中软链接文件又称为符号链接文件。 二、创…...

    2024/5/1 1:44:49
  4. 基于单片机的数字万用表设计

    **单片机设计介绍&#xff0c;基于单片机的数字万用表设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的数字万用表设计概要是关于使用单片机技术来实现数字万用表功能的一种设计方案。下面将详细概述该设计的各个…...

    2024/4/30 3:14:15
  5. 理解 Golang 变量在内存分配中的规则

    为什么有些变量在堆中分配、有些却在栈中分配&#xff1f; 我们先看来栈和堆的特点&#xff1a; 简单总结就是&#xff1a; 栈&#xff1a;函数局部变量&#xff0c;小数据 堆&#xff1a;大的局部变量&#xff0c;函数内部产生逃逸的变量&#xff0c;动态分配的数据&#x…...

    2024/4/30 2:57:27
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/29 23:16:47
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57