APP程序服务器和数据库服务器有什么区别。

数据库服务器一般都装有数据库如oracle,mssql,mysql等,如:oracle的linux服务器,

应用服务器是你的应用得服务器,提供应用服务,如你的j2ee中间件:基于jboss,weblogic等的应用,也可以是自己的网络应用服务器,接口服务器是提供给第三方调用的服务,主要是为了我们自己的应用得安全性,所以我们只把能供给第三方调用的东西封装在接口服务器

数据服务器和应用服务器有什么区别?
不知道你对数据库了解不了解!数据库服务器简单点:还不好和你解释!

数据库服务器

数据库:存储数据的应用软件

服务器:公共的意思了!

一台机子!安装一个软件,你可以用,别人也可以用!就像你的电脑一样可以有多个用户一样,你可以用你的用户名登陆,别人可以有另一个用户名登陆,就是说可以有多个人用,但是每个人又是独立的!(当然这个还是有点区别的!)

首先,根据你应用环境的不同,需要的数据库服务器也不同,一般来说,如果数据库服务器需要连接的客户端多、并且是不同权限组的客户端的话需要网络接口比较多的,除此之外,数据库服务器的处理器性能要求比较高,因为其要进行频繁的操作,内存要求大,加快数据存取速度。

应用服务器相对而言要求低一些,如果是FTP服务器的话网卡的速率要求要高,起码是千兆的,网页服务器对于网卡的速率也同样有较高的要求,但对于处理器性能要求就不那么高了。

其次,后面涉及到产品硬件这块也是非常重要的。

应用服务器位于网络和数据库之间,但是应用服务器实际上是做什么的?

应用程序服务器是为应用程序提供业务逻辑的。它是基于组件的,位于以服务器为中心的架构的中间件。

这个架构通常是一个主要的基于Web的界面。中间件是业务逻辑所在的应用服务器。而第三层,后端是负责数据库的服务器。应用程序服务器充当用户和数据库之间的交互。

应用服务器通过各种协议向客户端应用程序打开业务逻辑。它还可以包括计算机,web服务器或其他应用服务器上的图形用户界面。业务逻辑通过组件API。它还管理自己的资源以及执行安全性,事务处理,资源和连接池以及消息传递。

对于高端要求,应用服务器往往具有高可用性监控,集群,负载平衡,集成冗余和高性能分布式应用服务,并支持复杂的数据库访问。

为什么要使用应用服务器?有什么好处?
当你需要与现有数据库和服务器(如Web服务器)集成时,应使用应用程序服务器。

它可以通过启用集中式方法来提供应用程序更新和升级来提供数据和代码的完整性。

可伸缩性是使用应用服务器的另一个原因和好处。应用程序服务器可以与数据库连接。这意味着企业可以扩展Web服务器群,而不需要增加数据库连接的数量。

另一个好处是安全。从网页到数据库的直接链接如果暴露,可导致SQL注入攻击基础架构。通过单独的数据访问层执行数据验证和/或显示业务逻辑,可以确保以Web表单输入的文本不被用作SQL调用。通过集中身份验证过程以及数据访问管理,还可以提高安全性。

它还可以通过对网络流量进行限制来提高对性能要求高的应用程序的性能。

它与其他类型服务器有何区别?
应用程序服务器与Web服务器不同,因为前者通过多种协议处理向应用程序提供业务逻辑,而Web服务器响应并处理HTTP请求;它托管一个网站并存储静态内容,如图像,CSS,JavaScript和HTML页面。虽然Web服务器可能不支持事务或数据库连接,但它可能具有容错和可扩展性功能,如负载平衡,缓存和集群。

它与数据库服务器不同,因为该服务器执行诸如数据分析,存储,数据处理,归档以及其他数据管理相关任务之类的任务。数据库服务器使用诸如ODBC,JDBC等协议。他们还将托管数据库,如Oracle,SQL Server,MySQL等。

web服务器和数据库服务器分离的优势

一般我们服务器都是分开的,网页服务器、数据服务器单独配置。

web服务器不掉,那么就可以正常使用,data服务器掉了,那么web还可以坚持一会。

如果是web服务器掉了,那么就上不去了,不过有一些设置有web服务器掉了就启动data中的备份web模拟服务器,可以在短时间内运行,节约问题。

所以 必须要分两个来安装,对于大项目而言。

如果没有成本,又是小项目,那么也就没有办法的事情,将就使用一个服务器了。

从好坏来分:

必须是两台安全, 数据库服务器可以只提供数据检索服务而不必处理其它服务。

且数据库服务器不需要外网,只在内网为WEB服务器提供数据查询服务即可。

WEB服务器可以只处理WEB请求,不处理数据库操作,可以更好的利用带宽资源

一台只是减少了成本,价格低了。缺点很明显,死掉了就一起死掉了。

callback 和 promise 性能差距疑问

callback
import * as fs from ‘fs’;
import * as path from ‘path’;
function list_dir(dir: string) {
fs.readdir(dir, ‘utf-8’, (err, files) => {
files.forEach(file => {
file = path.join(dir, file)
fs.stat(file, (err, stat) => {
if (stat.isDirectory()) {
list_dir(file)
}
if (stat.isFile()) {
file
// console.log(“%O”, file);
}
})
});
})
}

list_dir(‘.’)
promise
import * as util from ‘util’;
import * as fs from ‘fs’;
import * as path from ‘path’;
async function list_dir(dir: string) {
const readdir = util.promisify(fs.readdir);
const stat = util.promisify(fs.stat);
const files = await readdir(dir, ‘utf-8’)
files.forEach(async file => {
file = path.join(dir, file)
const state = await stat(file)
if (state.isDirectory()) {
await list_dir(file)
}
if (state.isFile()) {
file
// console.log(“%O”, file);
}
})

}

list_dir(‘.’)
性能测试结果
node ➜ /workspaces/typescript $ time node promise.js && time node callback.js

real 0m1.140s
user 0m1.136s
sys 0m1.292s

real 0m0.377s
user 0m0.368s
sys 0m0.534s
node ➜ /workspaces/typescript $ time node promise.js && time node callback.js

real 0m1.062s
user 0m1.132s
sys 0m1.184s

real 0m0.538s
user 0m0.470s
sys 0m0.784s
node ➜ /workspaces/typescript $ time node promise.js && time node callback.js

real 0m1.194s
user 0m1.221s
sys 0m1.308s

real 0m0.436s
user 0m0.393s
sys 0m0.651s
node ➜ /workspaces/typescript $ time node promise.js && time node callback.js

real 0m1.024s
user 0m1.165s
sys 0m1.027s

real 0m0.416s
user 0m0.313s
sys 0m0.653s
node ➜ /workspaces/typescript $ nodejs –version
v16.3.0
node ➜ /workspaces/typescript $ tsc –version
Version 4.3.5
有性能差异可以理解,但是这个性能差异过大,请问各位是我的写法有问题,还是其它原因导致的呢?

Node file dir sys24 条回复 • 2021-08-03 17:57:00 +08:00
maokai 1
maokai 27 天前
❯ node –version
v14.17.3

❯ time node /tmp/promise.js && time node /tmp/callback.js
node /tmp/promise.js 0.66s user 0.84s system 169% cpu 0.887 total
node /tmp/callback.js 0.42s user 1.13s system 192% cpu 0.806 total
❯ time node /tmp/promise.js && time node /tmp/callback.js
node /tmp/promise.js 0.61s user 0.92s system 169% cpu 0.899 total
node /tmp/callback.js 0.41s user 0.84s system 156% cpu 0.804 total
❯ time node /tmp/promise.js && time node /tmp/callback.js
node /tmp/promise.js 0.46s user 1.03s system 168% cpu 0.886 total
node /tmp/callback.js 0.30s user 0.76s system 134% cpu 0.783 total

❯ time node /tmp/callback.js&& time node /tmp/promise.js
node /tmp/callback.js 0.44s user 0.81s system 160% cpu 0.772 total
node /tmp/promise.js 0.64s user 0.89s system 170% cpu 0.898 total
❯ time node /tmp/callback.js&& time node /tmp/promise.js
node /tmp/callback.js 0.39s user 0.87s system 163% cpu 0.776 total
node /tmp/promise.js 0.58s user 0.92s system 168% cpu 0.885 total
❯ time node /tmp/callback.js&& time node /tmp/promise.js
node /tmp/callback.js 0.36s user 0.93s system 166% cpu 0.777 total
node /tmp/promise.js 0.61s user 0.90s system 170% cpu 0.884 total
raptium 2
raptium 27 天前 via iPhone
一个串行 一个并行?
muzuiget 3
muzuiget 27 天前
为什么拿 IO 来测试,IO 时间本来就是不确定的。

再说,为什么你会有 callback 和 promise 性能问题,这两东西语法上是可以互转的,就像你那个 util.promisify 。

一般来说,node 会把所有事件处理完毕就退出,所以你的代码,*慢那次 IO 操作就是程序的运行时间。
littlepanzh 4
littlepanzh 27 天前 via iPhone
*个,你这是 typescript,tsconfig 里 target 用的是什么呢?如果不是 esnext 的话用 async/await 会有很多额外开销。

第二个,什么版本的 nodejs ? 14+就不要用 utils.promisfy 了,import fs from ‘fs/promises’不好吗
seki 5
seki 27 天前
async 和 forEach 不搭,改成

await Promise.all(files.map(async (file) => {}))) 试试看
maokai 6
maokai 27 天前
哦,对了,你需要把两个 util.promisify 拿到 list_dir 外面来,这样测出的结果差距就小一些了:

❯ time node /tmp/promise.js && sleep 1 && time node /tmp/callback.js
node /tmp/promise.js 0.45s user 0.75s system 142% cpu 0.837 total
node /tmp/callback.js 0.58s user 0.99s system 196% cpu 0.800 total
❯ time node /tmp/promise.js && sleep 1 && time node /tmp/callback.js
node /tmp/promise.js 0.53s user 0.98s system 175% cpu 0.855 total
node /tmp/callback.js 0.38s user 1.00s system 173% cpu 0.794 total
❯ time node /tmp/promise.js && sleep 1 && time node /tmp/callback.js
node /tmp/promise.js 0.55s user 0.98s system 183% cpu 0.835 total
node /tmp/callback.js 0.52s user 0.86s system 173% cpu 0.797 total

❯ time node /tmp/callback.js && sleep 1 && time node /tmp/promise.js
node /tmp/callback.js 0.48s user 0.90s system 173% cpu 0.801 total
node /tmp/promise.js 0.63s user 1.02s system 192% cpu 0.857 total
❯ time node /tmp/callback.js && sleep 1 && time node /tmp/promise.js
node /tmp/callback.js 0.41s user 0.98s system 172% cpu 0.807 total
node /tmp/promise.js 0.59s user 0.89s system 172% cpu 0.857 total
❯ time node /tmp/callback.js && sleep 1 && time node /tmp/promise.js
node /tmp/callback.js 0.42s user 1.05s system 184% cpu 0.798 total
node /tmp/promise.js 0.56s user 0.95s system 177% cpu 0.848 total
myqoo 7
myqoo 26 天前
await 性能非常非常差,注重性能的场合尽量回避。不过在 IO 的场合不明显,偏向纯计算的时候就非常明显了。

这里有个测试
https://gist.github.com/EtherDream/52649e4939008e149d0cb3a944c055b7 显示 Gist 代码

“`js
async function pending() {
return 11
}

function mayPending() {
if (Math.random() < 0.001) {
return pending()
}
return 22
}

async function main() {
console.time(‘s1’)
for (let i = 0; i < 1e6; i++) {
const val = await mayPending()
}
console.timeEnd(‘s1’)

console.time(‘s2’)
for (let i = 0; i < 1e6; i++) {
const ret = mayPending()
const val = ret instanceof Promise ? await ret : ret
}
console.timeEnd(‘s2’)
}

main()
“`

s1: 1715.09521484375 ms
s2: 20.174072265625 ms
Mitt 8
Mitt 26 天前
@myqoo #7 这明显是你的问题了, 性能有差距也不会差这么多,你都差了 80 多倍了,而且引入随机数产生的不确定性更能被采纳为性能测试指标。
Mitt 9
Mitt 26 天前
@Mitt #8 更能 => 更不能
Mitt 10
Mitt 26 天前
@myqoo #7 https://onecompiler.com/javascript/3x5s8ss8k 在线跑差分的话,1e6 次性能差距也就是几毫秒,几乎是可以忽略的,因为你实际场景根本不会遇到这种超大量的 promise 混杂的情况,纯计算受影响的也只是线程切换,不会有这种开一大堆 promise 去计算的,这个是纯粹的开销,不符合实际场景的。

myqoo 11
myqoo 26 天前
@Mitt 即使单次随机数耗时不固定,但在大量次数下是稳定的,你可以试试取消 await 部分,纯粹计算随机数两者用时几乎是相等的。事实上 await 就是差那么多,甚至不止 80 倍。可以看 js 引擎源码,await 实现开销很大的,比传统语言的纤程开销大很多。
myqoo 12
myqoo 26 天前
@Mitt 开 promise 去计算的情况是有的,当然是代码写的不够好。比如有些函数 99.99% 情况只是计算,*小情况可能会用 await 调用一个异步 API,但 await 必须放在 async 函数里,所有每次调这个函数都是在创建 promise 。
myqoo 13
myqoo 26 天前
@Mitt 可以试试这个:

console.time(‘s’)
for (let i = 0; i < 10000; i++) {
await i
}
console.timeEnd(‘s’)

执行 1 万次 await 耗时差不多 20ms 了。
Mitt 14
Mitt 26 天前
@myqoo #13 异步开销是有的没错,但是我更倾向于你的测试方式不切实际,用超短程测试方式当然会显著增加额外开销这是必然的,但是实际应用下几乎不可能会有人写这样的代码,首先你 await 对象就是 non-promise,没人会这么干,而且你这种场景是很容易被“编译器”优化的,用空跑来对比的方式其实是完全舍弃掉了 async/await 的优势,仅仅是单把额外开销拿出来放大了而已,你的代码越常规这点开销越不显眼的,不然这个测试方式不仅是 js,任何语言的优势都可以被测出来无限的额外开销。
BaiLinfeng 15
BaiLinfeng 26 天前
我居然看不懂
myqoo 16
myqoo 26 天前
@Mitt await 一个 non-promise 是很常见的。比如一个 async 函数再调用 IO 之前先判断内存缓存,存在就直接返回了。但调用方仍然会用 await 去执行这个函数,相当于 await non-promise 。而且不知为什么目前所有 JS 引擎都不会优化这种调用,所以才有上述那个 gist 的测试案例。
dfkjgklfdjg 17
dfkjgklfdjg 25 天前
为啥我觉得是 forEach+await 的问题,每次都停下来等了
zhuweiyou 18
zhuweiyou 25 天前
1. util.promisify 移到方法体外
2. forEach + await 是谁教你的…
Austaras 19
Austaras 25 天前
@myqoo 你等于在问
“`
async function foo() {}

await foo()
“`
不是即时执行的,这就是 js 把 async 和 promise 绑定带来的问题,一个 async 函数,无论怎样返回的东西都是一个 promise,所以一定要在下一个 microtask 里执行
kebyn 20
kebyn 25 天前
@seki async 和 forEach 不搭,这个没有考虑到,但是修改后,性能没有很大的改进
@maokai 去除 util.promisify 差距也是蛮大的
@myqoo 目前看来就是 promise 的开销问题

carbon


CokeMine 21
CokeMine 24 天前
async 和 forEach 一起写一般 IDE 会有提示吧。
不是很清楚,试试楼上的写法再测一下
libook 22
libook 24 天前
我从 ES6 正式发布之后就一直在关注 V8 的 promise 性能情况,V8 官方有个测试用例 https://github.com/v8/promise-performance-tests
你可以 clone 跑一下看看,涵盖了原生 promise 、async/await 和主流的 promise 库的性能测试。我是见证了从一开始被 bluebird 虐逐渐到完爆 bluebird 。不过这个用例里面没有 callback,你可以参考其他的例子自己写一个。

这种测试*好不要引入 fs,因为文件系统是由操作系统管理调度的,有些操作系统比如 Linux 会有一些奇淫技巧的缓存优化,所以要测的话就测语法本身的计算性能,看语法糖是否会带来额外的计算性能损耗,或者是否反而提升了计算效率。
TomVista 23
TomVista 24 天前
@Austaras 这是正确答案
hungrybirder 24
hungrybirder 9 天前
重启电脑,先运行 callback.js 再运行 promise.js 试试,vfs cache~~

大数据服务器环境配置

大数据服务器环境配置

前言:

本人萌新,*近买了3台云服务器便想自己搭建一个大数据的环境。因为是试手服务器,加上是学生党没什么钱呀~所以配置没买太高。本人选择了3台1核2G的服务器。

1. 操作系统选择

因为是云服务器,就少了装系统等不必要的麻烦(瞬间省了好多事有木有)。在下选择的是Centos7.3的系统。

2.网卡环境

因为本人使用的是云服务器,所以网卡便不需要怎么配置啦。

假设是虚拟机或者是自己用的服务器则需要设置.NAT模式和修改IP地址。具体不在此描述。

3.下载安装一系列的辅助功能软件

这些软件其实都是便于你操作,假设你是大神或者不嫌烦的话也可以直接使用服务器,本人在工具上选择的是Xshell,Xftp,notepad++.

3.1 安装Xshell

3.1.1功能作用

Xshell是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。

Xshell可以在Windows界面下用来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。

3.1.2.下载地址

http://www.netsarang.com/products/xsh_overview.html

3.1.3安装

安装总会吧!本人事先装过了所以不截图师范了。记得装在自己熟悉的路径下。

3.1.4打开配置

名称 起自己喜欢的;

主机 用服务器的ID或者自己可以在windows上自己配置映射从而使用映射名字。那么在以后的笔记中会写;

端口 22;

点击 确定。

3.1.5输入账号密码

(注:首次登入时会有个秘钥验证,选择是就行了)

3.1.6连接成功

3.2安装Xftp

3.2.1功能作用

是一个基于 MS windows 平台的功能强大的SFTP、FTP 文件传输软件。使用了 Xftp 以后,MS windows 用户能安全地在 UNIX/Linux 和 Windows PC 之间传输文件。Xftp 能同时适应初级用户和高级用户的需要。它采用了标准的 Windows 风格的向导,它简单的界面能与其他 Windows 应用程序紧密地协同工作,此外它还为高级用户提供了众多强劲的功能特性。

3.2.2.下载地址

https://www.netsarang.com/products/xfp_overview.html

3.2.3安装和Xshell雷同这里就贴个图了

3.2.4连接成功

3.3安装notepad++

3.2.1功能作用

本人平时用的笔记本。是一款非常有特色的编辑器。

3.2.2.下载地址

https://notepad-plus-plus.org/

3.2.3安装 不用我多说了吧 同上

3.2.4连接成功

4. 新建普通用户
我们操作服务器不可能老是用root用户吧!万一一个不小心删掉点东西~嘿嘿

结下来为我们这个新用户增加和root用户一样的权限

5. 修改机器名
机器名这种事情,怎么说呢。强迫症没办法。

我们在Centos7版本的话,使用以下一行代码便可。

而在Centos6版本的话,我还是说一下吧。在/etc/sysconfig/network下修改hostname

6. 修改映射

在映射中写下所有要Ping的机器!

7.关闭防火墙

Centos7关闭防火墙也只要两行代码呀

参考网站:https://www.aliyun.com/jiaocheng/121592.html

Centos6关闭的时候,我也说一下吧

首先关闭iptables

service iptables stop 临时关闭

chkconfig iptables off 开机不启动

其次关闭selinux(子安全系统)

vi /etc/sysconfig/selinux

在里面设置selinux=disabled

8.SSH免秘钥设置

这几台服务器需要互相连通不可能总是输入密码吧,包括本机有时候resourcemananger中也需要输入密码,避免麻烦所以这肯定是要配置的。

7.1配置

输入ssh-keygen -t rsa 一路回车

id_rsa -》私钥

id_rsa.pub -》公钥

在所以服务器中:输入ssh-copy-id 服务器名

配几台写几台

注意:自己也要给自己发送公钥和私钥!

authorized_keys -》将公钥保存到文件中远程拷贝到其他机器上保存

known_hosts -》记录秘钥信息

7.2报错解决:

如果没有生效,就删除.ssh目录下所有文件,重新生成

或者直接删除.ssh目录,生成方式ssh-keygen,就会生成.ssh目录,不要使用mkdir

7.3配置了SSH之后,就不需要输入密码,直接可以启动多个节点的服务进程,比如:sbin/start-dfs.sh

9.集群节点时间同步

本人用的是云服务器,所以服务器时间是自动同步的,不需要配置了,哈哈哈哈。

但是有句说句,时间同步是非常必要的。

而具体方法有很多种,网上也都有教程。

那么本人把我以前部署vmware的教程写在下面。

1、模拟内网环境

在集群中找一台服务器作为:时间服务器

bigdata01 时间服务器

bigdata02和bigdata03同步01这台机器

2、查看Linux中的ntpd时间服务(这里只要开启*台机器的ntpd服务,其他的不用开)

sudo service ntpd status

sudo service ntpd start

3、开机设置(在*台设置,其他不要设置)

sudo chkconfig ntpd on

4、修改系统文件

vi /etc/ntp.conf

【*处】修改为自己的网段,注意将前面的#去掉,生效

# Hosts on local network are less restricted.

restrict 192.168.163.0 mask 255.255.255.0 nomodify notrap

【第二处】由于是内网环境不用添加服务,前面加上注释

#server 0.centos.pool.ntp.org

#server 1.centos.pool.ntp.org

#server 2.centos.pool.ntp.org

【第三处】开启本地服务,注意将前面的#去掉,生效

server 127.127.1.0 # local clock

fudge 127.127.1.0 stratum 10

保存文件

5、修改完配置文件,建议重启ntpd服务,重新读取配置

sudo service ntpd restart

6、查看时间服务相关的命令

rpm -qa | grep ntp

ntpdate-4.2.4p8-3.el6.centos.x86_64 同步

ntp-4.2.4p8-3.el6.centos.x86_64 将某台选为时间服务器

7、可以先执行同步操作测试下

sudo /usr/sbin/ntpdate bigdata-01

误差在两三分钟内,是可以接受的

8、编写crontab定时任务,在需要同步的节点上编写(第二台和第三台)

##sync time

0-59/10 * * * * /usr/sbin/ntpdate fantai-01

10. Java环境的安装
大数据框架都是是基于java写出来的!所以java是必须的。

10.1通过国内的镜像源下载

java8 http://www.linuxidc.com/Linux/2015-05/117967.htm

10.2通过XFTP等文件传输软件

传输安装包,解压JDK到指定的目录下,目录任意,建议不要装在某个用户主目录下

-我选择安装在/opt目录下

(记得先修改权限 chown -R hadoop:hadoop /opt/ 使用自己的权限不要root)

10.3添加环境变量

修改vi /etc/profile文件,配置jdk环境变量

#JAVA_HOME

export JAVA_HOME=/opt/modules/jdk1.8.0_161/

export PATH=$PATH:$JAVA_HOME/bin

10.4验证是否配置成功:java -version

jps命令可以查看java 进程

nodejs 怎样优雅的依赖同个模块的俩个版本?

##起因##

用的 vue.js +elementui, 然后想用新版本的 datepicker 组件,其他的用旧版本。新版本已经有已知的 bug 了,不适合全局用。

##问题## 所以想问下如何同时引用俩个版本的模块?其中一个版本其实只要一个组件。

##已经尝试的方案## 用 npm i element-ui-latest@npm:element-ui 这个命令可以让新旧版本同时存在,并且引用,但是引用的时候出错。原因是 datepicker 这组件的引用有用到 element-ui这个模块前缀,而不是全用相对位置。

第 1 条附言 · 17 天前
看来没啥好办法,曲线救国了一下。
全局用新版本,有 bug 的组件用了旧版本。 向旧兼容没出现问题
版本 引用 DatePicker element-ui8 条回复 • 2021-07-27 10:23:54 +08:00
chaoFanExcellent 1
chaoFanExcellent 17 天前
你把新版本的 datepicker 看源码自己写一个组件,其他的用旧版本就行了
JustLookBy 2
JustLookBy 17 天前
@chaoFanExcellent 啊这优雅嘛?
libook 3
libook 17 天前
如果每个组件之间互相独立,那么你可以直接把相应组件的代码复制到本地项目里,重命名成另一个组件名。

如果组件之间耦合较高,那么可以了解一下微前端。

*优雅的方式是只用一个版本。
renmu123 4
renmu123 17 天前 via Android
旧版本的 bug 不比新版本多?
Jeremial 5
Jeremial 17 天前
yarn 的别名了解一下?
A 模块版本 1, 同时给 A 模块起一个别名 B, 使用版本 2
Jeremial 6
Jeremial 17 天前
@Jeremial #5
官方文档 https://classic.yarnpkg.com/en/docs/cli/add/#toc-yarn-add-alias
https://til.hashrocket.com/posts/oxmc7kencg-alias-an-npm-package-with-yarn-add
JustLookBy 7
JustLookBy 17 天前
@libook 耦合度太高了,不好 copy,我是在已有项目上加个小功能而已,微前端应该不适用?
@renmu123 项目是旧版本搭建的,没啥 bug?。

@Jeremial 你这个和我尝试的那个方案是一样的 `npm i element-ui-latest@npm:element-ui`,行不通
wednesdayco 8
wednesdayco 17 天前
“两个版本”这底子就不优雅了,不如把老版本升级?

npm node_modules 为什么会是现在这样

都在吐槽 npm 的设计,依赖地狱、小文件多、占用空间大、慢。

那是什么导致了 npm 必须设计成现在这样呢,其它语言的包管理工具为什么没有这些问题(比如 manven)?

node 包管理有没有新的方案在开发中?

第 1 条附言 · 1 天前
看了这个帖子提的问

https://www.v2ex.com/t/794664#reply94
npm manven Node 地狱32 条回复 • 2021-08-13 11:54:52 +08:00
lbunderway 1
lbunderway 1 天前 ❤️ 1
我觉得 npm 的报管理还行啊,
包的依赖是有改进地方,但没到地狱那么夸张吧,
小文件多是什么意思呢
项目 node_module 占用空间应该在 500M 以内吧,发布环境再指定环境安装再砍掉一半空间,就现在的硬件条件这个空间不是什么吧
慢是什么慢呢

其他语言不了解,至少比 go 好用,哈哈
zed1018 2
zed1018 1 天前 ❤️ 1
新版本的 npm 还行吧。或者换 yarn 。node_modules 里东西多,依赖复杂主要还是 js 生态没有一个比较强的 std lib 吧。啥都要导个包。依赖能少么。
chengxy 3
chengxy 1 天前
@lbunderway #1 慢应该是从 npm 服务器去找详细下载地址慢,如果有 lock 文件会快很多。
netwjx 4
netwjx 1 天前
是 java dotnet php… 等等以前古典语言的模块管理机制导致 npm 设计成现在这个样子的

也就是 npm 是一个纯粹为了工程上行得通, 没太考虑优美的方案
XTTX 5
XTTX 1 天前
反正我经常 npm install 报错, 改用 yarn install 就没有问题。
learningman 6
learningman 1 天前 via Android
其他语言也有这些问题的,有些是靠编译解决了一部分。
但是主要还是前端库太多了,依赖链条一长就变成这样了。
yejinmo 7
yejinmo 1 天前
“项目 node_module 占用空间应该在 500M 以内吧”

这个吧 好家伙 500M 算是可以接受的空间了么 是真没见过别的语言的包管理机制?
sleepm 8
sleepm 1 天前
还可以试试 https://pnpm.io/
4771314 9
4771314 1 天前
新版本的 npm 已经不错了,老版本的才是恶心,那时候真是地狱
也可以试下 yarn 和 pnpm,我感觉没有差太多
慢的问题可以看下网络和数据源的选择,国内可以使用淘宝或其他的数据源,会快一些
Rrrrrr 10
Rrrrrr 1 天前
npm 本身还是没有规范。doc, src 为什么要上传。Github/gitlab 地址给出,让用户自己去看就好了。展平+单文件估计可以省很多空间。

ruxuan1306 11
ruxuan1306 1 天前
@sleepm 看了下,感觉 npm install –global 又回来了
agagega 12
agagega 1 天前 via iPhone
Ruby 默认是安装到语言目录而不是项目目录的,而且很久以前就有 lock 文件
otakustay 13
otakustay 1 天前
@ruxuan1306 倒也不是,global 只能 install 一个版本吧,pnpm 好歹让你感觉上和 local install 没有区别
MengiNo 14
MengiNo 1 天前 via Android
go 感觉是比较完美的,特别是容器化后专门一个 volume 挂载 module 目录,所有项目通用。npm 黑洞真的心疼硬盘,不能理解为什么要一个项目一个包,PHP 是特殊的运行机制决定的,而 Node 工程化变成编译型语言后,为啥不和 go 那样设计成 “从仓库里找工具包” 的感觉。
Trim21 15
Trim21 1 天前 via Android
小文件多是因为 js 语言本身标准库不怎么样,挺多简单的功能不想自己写就得找个现成依赖。
JeffersonQin 16
JeffersonQin 1 天前
@Trim21 捕捉 bangumi 大佬(之前有在论坛问过爬虫的问题?
luob 17
luob 1 天前 ❤️ 4
node_modules 无底洞这口锅分给谁都行,恰恰只有 npm 一点都分不上。反而是因为 npm 设计得非常优秀,各种循环依赖重复依赖版本问题都能得到解决,使得各种无底洞居然还能勉强跑起来。
你要觉得是 npm 过于优秀导致的大家胡乱搞依赖所以一定要分给它锅那我也无话可说。但是你说有没有新的方案在开发中就太扯了,难道要把功能全砍掉重新开发一个基于 git 地址的残废包管理器用强行增加用新包的难度来促使包的平均质量增加吗?
Trim21 18
Trim21 1 天前 via Android
@JeffersonQin 草,别这么叫,太尴尬了…
laozhoubuluo 19
laozhoubuluo 1 天前
依赖地狱、小文件多、占用空间大、慢 不能说是 npm 的问题,是 JS 生态滥用三方包导致软件复杂度严重升高的结果,毕竟软件成品的复杂度肯定是大于需求的复杂度的。
甚至再说大一点,任何滥用三方包的应用程序或者说生态的成品都会遇到上述四个问题。每一层组件都滥用三方包之后,再用这些组件层层叠加组成的项目肯定是各种无底洞的,开发再聪明也无能为力。
rockdai 20
rockdai 1 天前
试试 https://github.com/cnpm/cnpm
MrKrabs 21
MrKrabs 1 天前
warning 地狱
wangkun025 22
wangkun025 1 天前
看了下 ruby 的,我的 700 多 M,不过是共享的,当然也可以设置单独的 set 。
aristolochic 23
aristolochic 1 天前
有一部分原因应该和 Node 依照文件系统逐级查找,且一个包有很多种入口可能性,需要按照 Fallback 顺序检测直到完成加载的模块 Resolution 机制有关。这种模型包括 CommonJS 设计之初是基于文件系统的访问速度很快可以忽略不记的假设成立之上的。连它本身都这么设计,npm 也没有道理不一切从简,然后就出现了比黑洞更深,令 Windows 瑟瑟发抖的恐怖存在。谁能想到之后会如此复杂,npm 也不得不做出调整。包括 yarn PnP 设计的一大理由就是没有理由惯着 Node 这么粗放动态的模块 Resolution 机制。

如果你说的是充当前端构建工具的 Node,那个占硬盘、小文件多、慢也占不到用户头上,如果乐意的话构建前安装,每次构建完了就删,和 CI 的思路就一样了;前端需要解决的问题复杂度已经很多人说过了,这个实在是没办法。另外谁叫所有人都在写 SPA,或许是图方便大量程序员间的协调?不少人说前端卷,好像在想尽办法提升后来人的入门台阶。这个确实有,比如各种 KPI 开源项目,不过这顶帽子怎么也安不到 npm 和 node_modules 上。

如果你说的是当后端使的 Node,除了有很多框架原生支持 TypeScript 之外,似乎很少有听说过后端需要编译的。后端领域因为环境可控,不太可能会引入前端的那些 Polyfill/Shim, Transpiling, Purge 库和相关的 Bundle 工具链等等,node_modules 不会很夸张。所以 Node 作为所谓 Server Side JS,其实并没有后端生态( x

要说未来发展,听各位描述了一下 pnpm,似乎约等于 Node 版的 Bundler 啊。我还挺期待 yarn PnP 以后会是什么样子,毕竟 npm 抄过 yarn 的依赖扁平化,没道理不再抄一次。

不过私以为影响 Node (主要是前端)生态的*大问题是,再过几年可能所有人都去用 esbuild 这种压根不打包的工具( Elixir Phoenix 1.6 就已经决定把 Node 和 webpack 踢了,自己管理 esbuild 。这样用一个单一的二进制,所有进程都由 Erlang BEAM Port 管理还恰恰更加符合 Elixir Mix 的特色),除了老项目之外还有没有 Node 的事还不一定呢,所以干脆就别改了,现凑活凑活用过这几年算了吧(逃
jsq2627 24
jsq2627 1 天前
@aristolochic 就目前看来 pnpm 相当程度上夺走了 yarn 的风光。yarn 现在都出到 v3 了,PnP 生态还是没搞起来,各种主流框架工具(点名 typescript )都没能全支持。更不用说一大堆人还停留在 yarn v1 。不过 yarn workspace 还是算比较给力的。

pnpm 算是用相当折中的方式来解决依赖地狱问题。尽管 node_modules 还是层层相套,但是 symlink 节省了很大空间,而且跨项目共享一个 store 。目前唯一问题是个别工具对 symlinked node_modules 兼容不够好(点名 jest )。

这两年 esbuild / vite 爆火,webpack 也算是完成探索前端工程化的历史使命了
version 25
version 1 天前
依赖要学会精简呢…
nodejs 一般项目也就 60m 左右 vue 项目 100m 左右
如果大的太离谱.是不是项目第三方用太多造成的..
有些东西能自己开发就少用第三方库.万年不升级优化 package.json 那也是项目大坑
joesonw 26
joesonw 1 天前
@Rrrrrr .npmignore 就可以不发布. 作者的问题而已.
Rrrrrr 27
Rrrrrr 1 天前
@joesonw 那也是不够规范。比如某个包超过一定的依赖,它就得锁住,不然开发者一删除,就全挂了
chenmobuys 28
chenmobuys 1 天前
一个函数都要引用一下依赖,各种 README,能不大吗。
sarlanori 29
sarlanori 6 小时 4 分钟前
node_modules 占用空间其实都还能忍受,关键是它小文件太多啊,这点太要命了,拷贝删除都非常的慢,慢的令人发指
lap510200 30
lap510200 6 小时 4 分钟前
@lbunderway go 挺好用的啊 不是有 go.mod 吗 而且在依赖库文件体积上 go.mod 要比 manven composer 这些小多了
lap510200 31
lap510200 5 小时 59 分钟前
@yejinmo 你看他说 go 的包管理不咋样,就知道了 ,完全不懂别的语言,node js 的包管理比其他的差多了
lewinlan 32
lewinlan 3 小时 28 分钟前 via Android
1 楼 go 黑给我看笑了

计算机服务器和数据库的关系,Web服务器,应用服务器和数据库服务器之间的区别…

Neville Kuyt..

35

这常常令人困惑.

首先 – “服务器”可以指物理事物(计算机)或逻辑事物(一种软件).

Web,应用程序和数据库服务器软件都可以在同一台物理服务器上运行,也可以分布在多台物理机上.大多数大型网站都有多台机器; 大多数”消费者”托管包在一个盒子上运行.

逻辑分离如下.

Web服务器处理HTTP(S)请求,并将这些请求传递给”处理程序”.它们具有用于文件请求的内置处理程序 – HTML页面,图像,CSS,JavaScript等.您可以为无法管理的请求添加其他处理程序 – 例如,应用程序服务器提供的动态页面.Web服务器实现HTTP规范,并知道如何管理请求和响应头.

应用程序服务器处理创建动态页面的请求.因此,它们不是提供存储在硬盘驱动器上的HTML页面,而是动态生成发送给*终用户的HTML.用于此的常用语言/框架是Java/JSP,.Net(aspx),PHP,Ruby(在Rails上或不在Rails上),Python等.大多数情况下,此应用程序服务器软件在与Web相同的物理服务器计算机上运行服务器.

数据库服务器软件是应用程序存储其结构化信息的地方.通常,这意味着自定义软件允许应用程序服务器使用编程语言提出诸如”用户x在其购物篮中有多少项目?”之类的问题.例如MySQL,SQL Server,Oracle(所有”关系数据库”)和MongoDB,Redis和CouchDB(“NoSQL”解决方案).

数据库软件可以在与Web服务器相同的物理机器上运行,但是当站点需要扩展时,它通常是在单独的物理硬件上托管的*件事.

二分法查找数组元素

二分法查找数组元素
问题描述
  用递归函数实现二分法查找数组元素。
  补充:要求给定数组采用如下代码定义
  int data[200];
  for (i=0; i<200; i++)
  data[i]=4*i+6;
输入格式
  输入一个待查找的整数(该整数一定在数组data中)。
输出格式
  该整数在数组中的指标。
样例输入
一个满足题目要求的输入范例。
例1:
262
例2:
438
例3:
774
样例输出
与上面的样例输入对应的输出。
例1:
64
例2:
108
例3:
192
数据规模和约定
  输入数据中每一个数的范围。
  输入数据必须满足4*i+6,i=0,1,2,3,…,198,199。
import java.util.*;
public class Main {
public static void find(int value,int[] data,int low,int head) {
int mid=(low+head)/2;
if(value<data[mid]) {
head=mid+1;
find(value,data,low,head);
}
else if(value>data[mid]) {
low=mid-1;
find(value,data,low,head);
}
else
System.out.println(mid);
}
public static void main(String []args) {
Scanner sc=new Scanner(System.in);
int[] data=new int[200];
for(int i=0;i<200;i++) {
data[i]=4*i+6;
}
find(sc.nextInt(),data,0,data.length-1);
}
}

大等于n的*小完全平方数

大等于n的*小完全平方数
  输出大等于n的*小的完全平方数。
  若一个数能表示成某个自然数的平方的形式,则称这个数为完全平方数
  Tips:注意数据范围
输入格式
  一个整数n
输出格式
  大等于n的*小的完全平方数
样例输入
71711
样例输出
71824
数据规模和约定
  n是32位有符号整数
开始代码前先来点小知识可能你会用的着
1思考一下怎么表示一个数为整数?
*种:double a; if(a==(int)a)
第二种思想一样只是该为if(a-(int)a==0)
2可以查一下自己用的语言有没有什么快捷方法表示开方的比如
java      math.sqrt(int a)
python    sqrt(a)  and a**0.5
c  sqrt(int a)
多关注一下这样的快捷方式我想考试应该做题快一点,好了开始贴我的代码了其实这是比较简单的题目我觉得这样的题目我们学到的应该是细心这里的数据要考虑到是否为负的情况和类型为32位的int型的数据是会错的。
import java.util.*;
import java.math.*;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
long per=sc.nextInt(),a;
if(per<=0)
a=0;//预防负数
else if((int)Math.sqrt(per)==Math.sqrt(per))
a=(int)Math.sqrt(per);
else
a=((int)Math.sqrt(per))+1;
System.out.println(a*a);
}
}

java读,写文件以字节方式

java读,写文件以字节方式
还有一种以字符方式的,可以自行百度
import java.util.*;
import java.io.*;
public class arithmetic {
public static void main(String[] args) throws IOException {
File f=new File(“./xuexi.txt”);//创建文件对象
Scanner sc=new Scanner(System.in);
try {
f.createNewFile();//创建文件
}catch(IOException e) {
e.printStackTrace();
System.out.println(“no one”);
}
try {
OutputStream out=new FileOutputStream(f);//建立输出流
for(int i=0;i<3;i++) {
String s=sc.next(),a=”\r\n”;
byte[] arr=s.getBytes();//字节输出流
byte[] b=a.getBytes();//换行
out.write(arr);
out.write(b);
}
out.close();
}catch(IOException e) {
e.printStackTrace();
}
int count=0;
try {
FileInputStream reader=new FileInputStream(f);//创建一个读的对象输入流
byte[] d=new byte[1024];//字节读文件
while((count=reader.read(d))!=-1) {//当read读到*后是会返回-1
System.out.println(new String(d));
}
}catch(FileNotFoundException e) {
e.printStackTrace();
}
}
}