当前位置: 首页 > 后端技术 > Node.js

node后端(koa)如何打包加密,node_modules如何优化?

时间:2023-04-04 01:01:59 Node.js

用node开发后台会存在哪些问题?我们在使用node做后端开发的时候遇到了三个问题。一个安全问题,代码没有编译直接通过,只要输入服务器代码就可以看的一清二楚。二是文件大小问题。任何一个项目的node_modules包都在100兆左右。三是部署问题。每次部署新项目,都需要下载安装插件,导致部署非常缓慢。我们有什么解决方案?首先,让我们来看看最重要的安全问题。Node不能像Java那样打包编译成一个小的jar包。但是我们前端也有编译混淆工具,比如webpack或者vite。学过vue、angular、react项目的同学,我想你应该对这个工具不陌生吧!webpack在前端领域确实用的很多,尤其是之前的vue2项目。其实也可以用于node环境的后端项目,比如expressframework,koaframework等,只是配置信息需要研究一下。我本着将所有代码(包括node_modules)打包到一个文件中的精神。结果在启动的时候发现了很多问题。这时候我换了一个方案,只把自己写的代码打包。node_modules插件包中的代码不再打包。结果真的很满意,我们可以看到整个文件大小不到两百kb。虽然可以看到混淆代码的源码,但就算破解了,也得手写才能恢复。因为里面的变量名都变成了abcd,代码阅读起来异常困难。100%还原源代码也是不可能的。附上webpack的配置代码如下constpath=require('path');constnodeExternals=require('webpack-node-externals');console.log(path.resolve(__dirname,"dist"))module.exports={entry:'./index.js',mode:'production',target:"node",输出:{path:path.resolve(__dirname,"dist_server"),filename:'index.js',路径publicPath:path.Resolve(__diRNAME,"Statics")},node:{},externals:[nodeExternals()],module:{},plugins:[],resolve:{}}虽然我们解决了安全问题,但是插件node_modules包体积太大。这也是对我们服务器资源的一种不必要的浪费。而且安装速度也很慢。我们之前的第一个解决方案是将node_modules使用的核心文件提取出来打包成一个文件。这显然是不可能的,而且存在很多问题。我们的项目使用相同的框架和技术,为什么多个项目不能使用相同的插件包呢?于是反复尝试,发现如果当前项目的package.json不存在,就会继续在上层文件夹中寻找。即只需要将多个项目放到一个文件夹中,然后添加package.json并安装即可。子文件夹中的所有项目都可以使用这个通用插件包。这样,我们就完美的解决了上面的问题。最终的打包速度也提升了很多,大概两秒左右就完成了打包。服务器的部署也简单很多。只需要上传一个200kb左右的打包文件,然后启动文件即可。(安装略)nodeserver打包编译后会出现哪些新问题?当然这还远远没有结束,因为我们发现打包后的静态文件是访问不了的。移动文件夹位置后反复测试,原来是数据库备份的位置也跑偏了。总之,读写文件的问题很多。反复阅读代码,发现我们在开发过程中使用了__dirname这样的变量,这个变量就是根据当前文件获取绝对位置。例如,如果在文章控制器中使用了该变量,则其绝对路径为D:\gitwork\guiplan-study-game-admin\servers\app\controller\articleController.js如果控制器中未使用该变量,但是app.js这样的目录,此时的绝对路径是D:\gitwork\guiplan-study-game-admin\servers\app\app.js。所以这个变量的值就变了。打包后的文件只有一个index.js文件,所有的文件都打包成一个文件,所以这时候可以使用变量__dirname,它指向的位置就是根目录。并且不会改变。因此,静态目录存储位置与数据库存储位置不同的原因。好的!我们找到了问题的原因,那么我们如何解决这个问题呢?其实用过webpack的同学应该对环境判断不陌生吧?是的,同样的后端打包编译我们也可以加一个环境判断。我们只需要对所有使用到变量__dirname的地方都加上一个判断,然后重新组装一个绝对路径即可。比如app.js中的渲染器代码render(app,{root:path.join(__dirname,'../',config.static.path,'view'),extname:'.html',debug:process.env.NODE_ENV!=='production',dateFormat:dateFormat=(value)=>{returnmoment(value).format('YYYY-MM-DDHH:mm');}});可以修改为让rootPaht=''if(process.env.NODE_ENV=='production'){rootPaht=path.join(__dirname,'/',config.static.path,'view')}else{rootPaht=path.join(__dirname,'../',config.static.path,'view')}render(app,{root:rootPaht,extname:'.html',debug:process.env.NODE_ENV!=='production',dateFormat:dateFormat=(value)=>{returnmoment(value).format('YYYY-MM-DDHH:mm');}});这样即使在编译打包后,也不会再出现静态文件目录全名记忆文字游戏案例显示不正确的问题。最后看一下我用guiplan低代码开发工具做的全名背单词游戏项目。小程序端的配置、后台、后台界面都是可视化开发。(uniapp小程序)(游戏后台管理)最后备份数据库,备份静态文件。静态文件包括文字图片、音频和后台管理系统源码、后台源码和前端页面等,所有文件加起来12兆。后续静态文件放在其他流媒体服务器上,数据库备份文件不算。一个前端和后端项目的总大小约为6兆字节。本来一个项目需要100多兆,优化后只有6兆左右。节省空间约20倍。转载自http://www.guiplan.com/articl...