pagemaker是一个前端页面制作工具,方便产品,运营和视觉的同学迅速开发简单的前端页面,从而可以解放前端同学的工作量。此项目创意来自网易乐得内部项目nfop中的pagemaker项目。原来项目的前端是采用jquery和模板ejs做的,每次组件的更新都会重绘整个dom,性能不是很好。因为当时react特别火,加上项目本身的适合,最后决定采用react来试试水。因为原来整个项目是包含很多子项目一起,所以后台的实现也没有参考,完全重写。

本项目只是原来项目的简单实现,去除了用的不多和复杂的组件。但麻雀虽小五脏俱全,本项目采用了react的一整套技术栈,适合那些对react有过前期学习,想通过demo来加深理解并动手实践的同学。建议学习本demo的之前,先学习/复习下相关的知识点:React 技术栈系列教程、Immutable 详解及 React 中实践。

线上地址

一、功能特点

  1. 组件丰富。有标题、图片、按钮、正文、音频、视频、统计、jscss输入。
  2. 实时预览。每次修改都可以立马看到最新的预览。
  3. 支持三种导入方式,支持导出配置文件。
  4. 支持恢复现场功能(关闭页面配置不丢失)
  5. 支持Undo/Redo操作。(组件个数发生变化为触发点)
  6. 可以随时发布、修改、删除已发布的页面。
  7. 本项目密码统一采用bcrypt编码,即使拖库也不会泄漏自己的密码。
  8. 每个页面都有一个发布密码,从而可以方便多人管理也可防止别人修改。
  9. 页面前端架构采用react+redux,并采用immutable数据结构。可以将每次组件的更新最小化,从而达到页面性能的最优化。
  10. 后台对上传的图片自动进行压缩,防止文件过大
  11. 适配移动端

二、用到的技术

1. 前端

  1. React
  2. Redux
  3. React-Redux
  4. Immutable
  5. React-Router
  6. fetch
  7. es6
  8. es7

2. 后台

  1. Node
  2. Express

3. 工具

  1. Webpack
  2. Sass
  3. Pug

三、脚手架工具

因为项目用的技术比较多,采用脚手架工具可以省去我们搭建项目的时间。经过搜索,我发现有三个用的比较多:
1. create-react-app create-react-app star数
2. react-starter-kit react-starter-kit star数
3. react-boilerplate react-boilerplate star数

github上的star数都很高,第一个是Facebook官方出的react demo。但是看下来,三个项目都比较庞大,引入了很多不需要的功能包。后来搜索了下,发现一个好用的脚手架工具:yeoman,大家可以选择相应的generator。我选择的是react-webpack。项目比较清爽,需要大家自己搭建redux和immutable环境,以及后台express。其实也好,锻炼下自己构建项目的能力。

四、核心代码分析

1. Store

Store 就是保存数据的地方,你可以把它看成一个容器。整个应用只能有一个 Store。

import { createStore } from 'redux';
import { combineReducers } from 'redux-immutable';import unit from './reducer/unit';
// import content from './reducer/content';let devToolsEnhancer = null;
if (process.env.NODE_ENV === 'development') {devToolsEnhancer = require('remote-redux-devtools');
}const reducers = combineReducers({ unit });
let store = null;
if (devToolsEnhancer) {store = createStore(reducers, devToolsEnhancer.default({ realtime: true, port: config.reduxDevPort }));
}
else {store = createStore(reducers);
}
export default store;

Redux 提供createStore这个函数,用来生成 Store。由于整个应用只有一个 State 对象,包含所有数据,对于大型应用来说,这个 State 必然十分庞大,导致 Reducer 函数也十分庞大。Redux 提供了一个 combineReducers 方法,用于 Reducer 的拆分。你只要定义各个子 Reducer 函数,然后用这个方法,将它们合成一个大的 Reducer。当然,我们这里只有一个 unit 的 Reducer ,拆不拆分都可以。

devToolsEnhancer是个中间件(middleware)。用于在开发环境时使用Redux DevTools来调试redux。

2. Action

Action 描述当前发生的事情。改变 State 的唯一办法,就是使用 Action。它会运送数据到 Store。

import Store from '../store';const dispatch = Store.dispatch;const actions = {addUnit: (name) => dispatch({ type: 'AddUnit', name }),copyUnit: (id) => dispatch({ type: 'CopyUnit', id }),editUnit: (id, prop, value) => dispatch({ type: 'EditUnit', id, prop, value }),removeUnit: (id) => dispatch({ type: 'RemoveUnit', id }),clear: () => dispatch({ type: 'Clear'}),insert: (data, index) => dispatch({ type: 'Insert', data, index}),moveUnit: (fid, tid) => dispatch({ type: 'MoveUnit', fid, tid }),
};export default actions;

State 的变化,会导致 View 的变化。但是,用户接触不到 State,只能接触到 View。所以,State 的变化必须是 View 导致的。Action 就是 View 发出的通知,表示 State 应该要发生变化了。代码中,我们定义了actions对象,他有很多属性,每个属性都是函数,函数的输出是派发了一个action对象,通过Store.dispatch发出。action是一个包含了必须的type属性,还有其他附带的信息。

3. Immutable

Immutable Data 就是一旦创建,就不能再被更改的数据。对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。详细介绍,推荐知乎上的Immutable 详解及 React 中实践。我们项目里用的是Facebook 工程师 Lee Byron 花费 3 年时间打造的immutable.js库。具体的API大家可以去官网学习。

熟悉 React 的都知道,React 做性能优化时有一个避免重复渲染的大招,就是使用 shouldComponentUpdate(),但它默认返回 true,即始终会执行 render() 方法,然后做 Virtual DOM 比较,并得出是否需要做真实 DOM 更新,这里往往会带来很多无必要的渲染并成为性能瓶颈。当然我们也可以在 shouldComponentUpdate() 中使用使用 deepCopy 和 deepCompare 来避免无必要的 render(),但 deepCopy 和 deepCompare 一般都是非常耗性能的。

Immutable 则提供了简洁高效的判断数据是否变化的方法,只需 ===(地址比较) 和 is( 值比较) 比较就能知道是否需要执行 render(),而这个操作几乎 0 成本,所以可以极大提高性能。修改后的 shouldComponentUpdate 是这样的:

import { is } from 'immutable';shouldComponentUpdate: (nextProps = {}, nextState = {}) => {const thisProps = this.props || {}, thisState = this.state || {};if (Object.keys(thisProps).length !== Object.keys(nextProps).length ||Object.keys(thisState).length !== Object.keys(nextState).length) {return true;}for (const key in nextProps) {if (thisProps[key] !== nextProps[key] || !is(thisProps[key], nextProps[key])) {return true;}}for (const key in nextState) {if (thisState[key] !== nextState[key] || !is(thisState[key], nextState[key])) {return true;}}return false;
}

使用 Immutable 后,如下图,当红色节点的 state 变化后,不会再渲染树中的所有节点,而是只渲染图中绿色的部分:

immutable演示

本项目中,我们采用支持 class 语法的 pure-render-decorator 来实现。我们希望达到的效果是:当我们编辑组件的属性时,其他组件并不被渲染,而且preview里,只有被修改的preview组件update,而其他preview组件不渲染。为了方便观察组件是否被渲染,我们人为的给组件增加了data-id的属性,其值为Math.random()的随机值。效果如下图所示:

immutable实际效果图

可见,当我们去改变标题组件标题文字的时候,只有标题组件和标题预览组件会被重新渲染,其他组件和预览组件并没有。这就是immutable带来的性能提升的地方。原来的项目当组件多了之后,渲染会卡顿,有时候甚至短暂黑屏。

4. Reducer

Store 收到 Action 以后,必须给出一个新的 State,这样 View 才会发生变化。这种 State 的计算过程就叫做 Reducer。

import immutable from 'immutable';const unitsConfig = immutable.fromJS({META: {type: 'META',name: 'META信息配置',title: '',keywords: '',desc: ''},TITLE: {type: 'TITLE',name: '标题',text: '',url: '',color: '#000',fontSize: "middle",textAlign: "center",padding: [0, 0, 0, 0],margin: [10, 0, 20, 0]},IMAGE: {type: 'IMAGE',name: '图片',address: '',url: '',bgColor: '#fff',padding: [0, 0, 0, 0],margin: [10, 0, 20, 0]},BUTTON: {type: 'BUTTON',name: '按钮',address: '',url: '',txt: '',margin: [0, 30, 20, 30],buttonStyle: "yellowStyle",bigRadius: true,style: 'default'},TEXTBODY: {type: 'TEXTBODY',name: '正文',text: '',textColor: '#333',bgColor: '#fff',fontSize: "small",textAlign: "center",padding: [0, 0, 0, 0],margin: [0, 30, 20, 30],changeLine: true,retract: true,bigLH: true,bigPD: true,noUL: true,borderRadius: true},AUDIO: {type: 'AUDIO',name: '音频',address: '',size: 'middle',position: 'topRight',bgColor: '#9160c3',loop: true,auto: true},VIDEO: {type: 'VIDEO',name: '视频',address: '',loop: true,auto: true,padding: [0, 0, 20, 0]},CODE: {type: 'CODE',name: 'JSCSS',js: '',css: ''},STATISTIC: {type: 'STATISTIC',name: '统计',id: ''}
})const initialState = immutable.fromJS([{type: 'META',name: 'META信息配置',title: '',keywords: '',desc: '',// 非常重要的属性,表明这次state变化来自哪个组件!fromType: ''}
]);function reducer(state = initialState, action) {let newState, localData, tmp// 初始化从localstorage取数据if (state === initialState) {localData = localStorage.getItem('config');!!localData && (state = immutable.fromJS(JSON.parse(localData)));// sessionStorage的初始化sessionStorage.setItem('configs', JSON.stringify([]));sessionStorage.setItem('index', 0);}switch (action.type) {case 'AddUnit': {tmp = state.push(unitsConfig.get(action.name));newState = tmp.setIn([0, 'fromType'], action.name);break}case 'CopyUnit': {tmp = state.push(state.get(action.id));newState = tmp.setIn([0, 'fromType'], state.getIn([action.id, 'type']));break}case 'EditUnit': {tmp = state.setIn([action.id, action.prop], action.value);newState = tmp.setIn([0, 'fromType'], state.getIn([action.id, 'type']));break}case 'RemoveUnit': {const type = state.getIn([action.id, 'type']);tmp = state.splice(action.id, 1);newState = tmp.setIn([0, 'fromType'], type);break}case 'Clear': {tmp = initialState;newState = tmp.setIn([0, 'fromType'], 'ALL');break}case 'Insert': {tmp = immutable.fromJS(action.data);newState = tmp.setIn([0, 'fromType'], 'ALL');break}case 'MoveUnit':{const {fid, tid} = action;const fitem = state.get(fid);if (fitem && fid != tid) {tmp = state.splice(fid, 1).splice(tid, 0, fitem);} else {tmp = state;}newState = tmp.setIn([0, 'fromType'], '');break;}default:newState = state;}// 更新localstorage,便于恢复现场localStorage.setItem('config', JSON.stringify(newState.toJS()));// 撤销,恢复操作(仅以组件数量变化为触发点,否则存储数据巨大,也没必要)let index = parseInt(sessionStorage.getItem('index'));let configs = JSON.parse(sessionStorage.getItem('configs'));if(action.type == 'Insert' && action.index){sessionStorage.setItem('index', index + action.index);}else{if(newState.toJS().length != state.toJS().length){// 组件的数量有变化,删除历史记录index指针状态之后的所有configs,将这次变化的config作为最新的记录configs.splice(index + 1, configs.length - index - 1, JSON.stringify(newState.toJS()));sessionStorage.setItem('configs', JSON.stringify(configs));sessionStorage.setItem('index', configs.length - 1);}else{// 组件数量没有变化,index不变。但是要更新存储的config配置configs.splice(index, 1, JSON.stringify(newState.toJS()));sessionStorage.setItem('configs', JSON.stringify(configs));}}// console.log(JSON.parse(sessionStorage.getItem('configs')));return newState
}export default reducer;

Reducer是一个函数,它接受Action和当前State作为参数,返回一个新的State。unitsConfig是存储着各个组件初始配置的对象集合,所有新添加的组件都从里边取初始值。State有一个初始值:initialState,包含META组件,因为每个web页面必定有一个META信息,而且只有一个,所以页面左侧组件列表里不包含它。

reducer会根据action的type不同,去执行相应的操作。但是一定要注意,immutable数据操作后要记得赋值。每次结束后我们都会去修改fromType值,是因为有的组件,比如AUDIO、CODE等修改后,预览的js代码需要重新执行一次才可以生效,而其他组件我们可以不用去执行,提高性能。

当然,我们页面也做了现场恢复功能(localStorage),也得益于immutable数据结构,我们实现了Redo/Undo的功能。Redo/Undo的功能仅会在组件个数有变化的时候计作一次版本,否则录取的的信息太多,会对性能造成影响。当然,组件信息发生变化我们是会去更新数组的。

5. 工作流程

如下图所示:
redux流程图

用户能接触到的只有view层,就是组件里的各种输入框,单选多选等。用户与之发生交互,会发出action。React-Redux提供connect方法,用于从UI组件生成容器组件。connect方法接受两个参数:mapStateToProps和mapDispatchToProps,按照React-Redux的API,我们需要将Store.dispatch(action)写在mapDispatchToProps函数里边,但是为了书写方便和直观看出这个action是哪里发出的,我们没有遵循这个API,而是直接写在在代码中。

然后,Store 自动调用 Reducer,并且传入两个参数:当前 State 和收到的 Action。 Reducer 会返回新的 State 。State 一旦有变化,Store 就会调用监听函数。在React-Redux规则里,我们需要提供mapStateToProps函数,建立一个从(外部的)state对象到(UI组件的)props对象的映射关系。mapStateToProps会订阅 Store,每当state更新的时候,就会自动执行,重新计算 UI 组件的参数,从而触发UI组件的重新渲染。大家可以看我们content.js组件的最后代码:

export default connect(state => ({unit: state.get('unit'),})
)(Content);

connect方法可以省略mapStateToProps参数,那样的话,UI组件就不会订阅Store,就是说 Store 的更新不会引起 UI 组件的更新。像header和footer组件,就是纯UI组件。

为什么我们的各个子组件都可以拿到state状态,那是因为我们在最顶层组件外面又包了一层 组件。入口文件index.js代码如下:

import "babel-polyfill";
import React from 'react';
import ReactDom from 'react-dom';
import { Provider } from 'react-redux';
import { Router, Route, IndexRoute, browserHistory } from 'react-router';import './index.scss';import Store from './store';import App from './components/app';ReactDom.render(<Provider store={Store}><Router history={browserHistory}><Route path="/" component={App}></Route></Router></Provider>,document.querySelector('#app')
);

我们的react-router采用的是browserHistory,使用的是HTML5的History API,路由切换交给后台。

五、使用说明

左边一栏是组件列表,在移动端点击左上角的双右箭头即可看到。点击对应的组件,网页中间会出现相应的组件信息。单击出来的组件头,可以切换展开与隐藏。更新相应的组件信息,在右侧可以看到实时预览。移动端需要点击右下角的黄色按钮(支持拖动)。

在中间区域的最上面有个内容配置区。左边有导入、导出、清空功能。导入支持支持导入json配置文件,这个配置文件可以在我们配置完准备发布的时候点击导出即可生成。还支持直接输入发布目录名称,比如:lmlc;或者输入完整的线上地址,比如:https://pagemaker.wty90.com/release/lmlc.html;当然也支持粘贴配置文件内容。清空会清空掉现在的所有配置的组件。内容配置区的右边是Redo/Undo功能。为了性能考虑,这里只以组件个数发生变化为触发点。

右侧是预览区域。中间区域内容一有变化,右侧会实时更新展示。当项目配置完成想要发布的时候,点击右侧区域左上角的发布按钮,会出现一个弹窗。第一个输入框是发布目录,如果是新项目需要创建发布密码。如果要更新已存在的项目,需要确认发布密码。平台密码是:pagemaker。如需更改,在data文件夹下修改password.json文件内容的value值。我们采用的是bcrypt编码。大家可以去BCrypt Calculator网站,方便计算出编码值。右上角有个查看按钮,可以查看采用 pagemaker 已经发布的页面。

隐藏功能:点击预览区域苹果手机的home键,会出现清理无用文件的弹窗,因为下载文件会在服务器端创建一个缓存文件。还有一些用户上传的图片等一直没有发布,在服务器端会一直堆积。这个需要提供后台密码,修改同平台密码,在data文件夹下的server_code.json文件。这个功能是针对管理员的,普通用户无须理会。

六、兼容性和打包优化

1. 兼容性

为了让页面更好的兼容IE9+和android浏览器,因为项目使用了babel,所以采用babel-polyfill和babel-plugin-transform-runtime插件。

2. Antd按需加载

Antd完整包特别大,有10M多。而我们项目里主要是采用了弹窗组件,所以我们应该采用按需加载。只需在.babelrc文件里配置一下即可,详见官方说明。

3. webpack配置externals属性

项目最后打包的main.js非常大,有接近10M多。在网上搜了很多方法,最后发现webpack配置externals属性的方法非常好。可以利用pc的多文件并行下载,降低自己服务器的压力和流量,同时可以利用cdn的缓存资源。配置如下所示:

externals: {"jquery": "jQuery","react": "React","react-dom": "ReactDOM",'CodeMirror': 'CodeMirror','immutable': 'Immutable','react-router': 'ReactRouter'
}

externals属性告诉webpack,如下的这些资源不进行打包,从外部引入。一般都是一些公共文件,比如jquery、react等。注意,因为这些文件从外部引入,所以在npm install的时候,有些依赖这些公共文件的包安装会报warning,所以看到这些大家不要紧张。经过处理,main.js文件大小降到3.7M,然后nginx配置下gzip编码压缩,最终将文件大小降到872KB。因为在移动端,文件加载还是比较慢的,我又给页面加了loading效果。

欢迎大家star学习交流:github地址 | 我的博客

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

相关文章

  1. Ryan Dahl的Node.js遗憾地导致了Deno

    如果创始人Ryan Dahl可以重新构建它,那么Node.js服务器端JavaScript运行时将是什么样子? 通过他的Deno项目,一个与Node.js建立在相同Google V8 JavaScript引擎上的安全TypeScript运行时,我们有了一个主意。 开源的Deno与Node.js没有明显的兼容性,它是对服务器端JavaScript…...

    2024/4/24 13:01:50
  2. Arduino遇到Node.js:通过Web界面控制LED的亮度

    作者:Abhiemanyu Pandit 编译:Tony我们已经看到了许多使用不同的微控制器和不同的编程语言使LED闪烁的示例。今天,我们将使用非常流行的JavaScript框架Node.js来控制连接到Arduino Uno的LED。我们还将使用Node.js通过Arduino 控制网页上的LED亮度。通过少量的调整和使用ESP8…...

    2024/4/23 21:03:36
  3. Node.js开发入门(三)——HTTP文件服务器

    HelloWorld示例只有演示意义,这次我们来搞一个实际的例子:文件服务器。我们使用Node.js创建一个HTTP协议的文件服务器,你可以使用浏览器或其它下载工具到文件服务器上下载文件。用Node.js实现的HTTP文件服务器,比我在Qt网络编程实战之HTTP服务器视频课程里用Qt实现的版本,…...

    2024/4/24 13:01:47
  4. 如何在Node.js中生成前端Excel电子表格

    有时您可能需要在Node.js应用程序生成Excel文件。您可能需要从数据库或Web服务获取数据,然后输出到Excel文件以进行进一步的报告或分析。 SpreadJS可以在服务器端不依赖任何Excel的情况下实现这一点。 Node.js是一种流行的事件驱动的JavaScript运行时环境,通常用于创建Web应用…...

    2024/4/24 13:01:46
  5. Node.js + Web Socket 打造即时聊天程序

    前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术。像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端。瞬间就有了一统天下的感觉,来往穿梭于前后端之间代码敲得飞起,从此由前端晋升为’前后端’。图片来自G+本文…...

    2024/4/24 13:01:46
  6. JavaScript 的进阶学习 (Node.js)_01

    Node的学习Node.js 是一个基于 Google 所开发的浏览器 Chrome V8 引擎的 JavaScript 运行环境。 属于 服务端的 JavaScript 。 2019.03.01 JavaScript 的进阶学习 (Node.js)_01Node 的特点 作为后端的JavaScript 的运行平台,Node 保留了前端浏览器 JavaScript 中那些熟悉的接…...

    2024/5/2 5:52:04
  7. node.js-中间件及中间件演示

    1、中间件中间件写一个日志功能 app.js app.use(function(req,res,next){var fs=require("fs");var ip=req.ip;var time=new Date().toLocaleString();var data=fs.readFileSync(./2020-2-2.log);data+=访问时间:+time+ip:+ip+\n;fs.writeFileSync(./2020-2-2.log,da…...

    2024/4/24 13:01:44
  8. eggjs视频教程分享

    eggjs视频教程分享网盘地址:https://pan.baidu.com/s/1a8-RY-aBm3YkH2ZqJKmztgEgg.js 基于Es6、Es7以及Typescript、Koa2,使得Nodejs具有更规范的开发模式、更低的学习成本、更优雅的代码、更少的开发成本、更少的维护成本,它是为企业级框架而生的,需要对eggjs做进一步的了…...

    2024/4/24 13:01:44
  9. Node.js 新特性将颠覆 AI、物联网等更多惊人领域

    点击蓝字 「前端小苑」关注我新版 Node.js 的特性并非这个平台此前的那些等闲卖点。Node.js 主要以其迅速和简洁而闻名。这也是为何那么多公司都愿意尝试 Node.js。然而,随着最新的 LTS(long-term support,长期支持)版本的发布,Node.js 将会带来很多让每位 Node.js 开发者…...

    2024/4/24 13:01:41
  10. 最新12套Vue.Js从基础到实战案例高级大合集

    01:智能社 - VueJs(1-11章全)02:m课网 - vue.js高仿饿了么(1-13章全)03:m课网 - webApp书城整站开发(vue.js+koa)04:网易课堂 - 走进vue.js 2.005:台湾小凡 - VueJs教程45节课06:CZBK - Vue.js+Node.js构建音乐播放器 公开课07:爱创课堂 - 张容铭js高级课程vue08:…...

    2024/4/24 13:01:40
  11. Node.js 知识(教程)

    JavaScript on the Server JavaScript was originally built for web browsers, but with Node.js we can use it on the server. We can perform server-related tasks like file system access.历史: JavaScript是前端开发的唯一标准。 2000年后开始的浏览器平台大战,导致了…...

    2024/4/24 13:01:39
  12. notejs 视频教程 智能社

    notejs 视频教程 智能社链接:https://pan.baidu.com/s/1CTRsn03a6wTF1gY4rpgN7Q 密码:srfn...

    2024/4/24 13:01:38
  13. 一篇帮你彻底弄懂NodeJs中的Buffer

    原文链接你是不是和我一样,对Node.js中的Buffer, Stream, 和 二进制数据一直都是很模糊的印象? 或者有的时候觉得,哎,我会用就行了,这些原理、底层的东西,应该交给Node.js的工程师们去理解。的确,这些名词可能会比较初学者感到恐惧和陌生,特别是那些刚从前端转全栈,做…...

    2024/4/24 13:01:37
  14. 环境搭建之Nodejs篇:手把手带你配置NodeJS

    第一章:环境搭建之Nodejs篇:手把手带你配置NodeJS本章将为大家讲述如何在windows环境下安装node.js环境及vue-cli,只需要按照步骤就可以完成,简单快速 1.1 安装包准备 在配置vue环境之前,需要以下开发环境安装包:node.js ——vue-cli环境依赖 webstorm——前端IDE chorme…...

    2024/4/24 13:01:36
  15. (pomelo系列入门教程)深入浅出Node.js游戏服务器开发--分布式聊天服务器搭建

    在上一篇文章中, 我们介绍了游戏服务器的基本架构、相关框架和Node.js开发游戏服务器的优势。本文我们将通过聊天服务器的设计与开发,来更深入地理解pomelo开发应用的基本流程、开发思路与相关的概念。本文并不是开发聊天服务器的tutorial,如果需要tutorial和源码可以看文章…...

    2024/4/24 13:01:36
  16. Vue.Js从基础到实战案例高级课程大合集12套视频 价值上千元

    01:智能社 - VueJs(1-11章全) 02:m课网 - vue.js高仿饿了么(1-13章全) 03:m课网 - webApp书城整站开发(vue.js+koa) 04:网易课堂 - 走进vue.js 2.0 05:台湾小凡 - VueJs教程45节课 06:CZBK - Vue.js+Node.js构建音乐播放器 公开课 07:爱创课堂 - 张容铭js高级课程…...

    2024/4/15 4:16:05
  17. 如何开始学习 Node.js?

    导读:本文译自 Stack Overflow 的同名问答贴“How do I get started with Node.js ”。求助者 Joneph O. 说:“有没有学习 Node.js 的好资源呢?教程、博客或书籍都可以。当然,我已经浏览查看 Node.js 的官方文档,但我不认为那是一个好的出发点。” 下面内容来自 yojimbo8…...

    2024/4/19 23:35:43
  18. 我如何开始使用Node.js [关闭]

    有什么好的资源可以开始使用Node.JS? 有没有好的教程,博客或书籍? 当然,我已经访问了它的官方网站http://nodejs.org/ ,但是我认为他们拥有的文档不是一个很好的起点。 #1楼 使用消息来源卢克。 不,但是我发现从源代码构建Node.js,运行测试以及查看基准确实使我走上了…...

    2024/4/27 11:31:53
  19. NodeJs(尚硅谷视频学习笔记)

    内容来自尚硅谷Nodejs学习课件以及自己添加 课前预热:CMD基本知识 1.命令行窗口(小黑屏)、CMD窗口、终端、shell - 开始菜单 --> 运行 --> CMD --> 回车 - Win + R --> CMD --> 回车 - 常用的指令dir 列出当前目录下的所有文件cd 目录名 进入到指定的…...

    2024/4/15 4:16:04
  20. Express 实战(二):Node.js 基础

    在上一篇文章中,我们简单的介绍了 Node.js 。了解到它基于 JavaScript、天生异步、拥有大量的第三方类库。本文将会在之前的基础上,对 Node.js 进行更深入的介绍。其中主要内容包括: Node 的安装 如何使用第三方模块生态 第三方模块的安装 一些简单的使用示例 开发过程中的一…...

    2024/4/24 13:01:37

最新文章

  1. 美国国防部数据网格参考架构概述(下)

    文章目录 前言四、行动者与角色五、基线服务与服务模式六、用例演示前言 DRMA从多个角度研究了CDAO数据网格的架构,以深入了解该网格将如何支持美国防部无缝访问联合数据、分析和基础设施以实现数字化转型和人工智能(AI)需求。它提供了一种战略性、原则性和技术性方法,通过…...

    2024/5/3 0:28:10
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. vulhub之Webmin篇

    Webmin是功能最强大的基于Web的Unix系统管理工具。管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作。Webmin支持绝大多数的Unix系统&#xff0c;这些系统除了各种版本的linux以外还包括&#xff1a;AIX、HPUX、Solaris、Unixware、Irix和FreeBSD等。 影响版本&…...

    2024/5/1 5:39:44
  4. 【Locust分布式压力测试】

    Locust分布式压力测试 https://docs.locust.io/en/stable/running-distributed.html Distributed load generation A single process running Locust can simulate a reasonably high throughput. For a simple test plan and small payloads it can make more than a thousan…...

    2024/5/2 10:47:24
  5. ROS2高效学习第十章 -- ros2 高级组件之大型项目中的 launch 其二

    ros2 高级组件之大型项目中的 launch 1 前言和资料2 正文2.1 启动 turtlesim&#xff0c;生成一个 turtle &#xff0c;设置背景色2.2 使用 event handler 重写上节的样例2.3 turtle_tf_mimic_rviz_launch 样例 3 总结 1 前言和资料 早在ROS2高效学习第四章 – ros2 topic 编程…...

    2024/5/2 10:47:23
  6. 【外汇早评】美通胀数据走低,美元调整

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

    2024/5/1 17:30:59
  7. 【原油贵金属周评】原油多头拥挤,价格调整

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

    2024/5/2 16:16:39
  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/5/2 9:28:15
  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/5/2 15:04:34
  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/5/1 4:32:01
  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/5/2 9:07:46
  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