ubantu20,gcc12,python3 v18.19 二进制安装
cd /wks/nodejs/app/ wget https://nodejs.org/dist/v18.19.0/node-v18.19.0-linux-x64.tar.xz tar -xvf node-v18.19.0-linux-x64.tar.xz vim ~/.bashrc export NODEWKS=/wks/nodejs export NODE_BASE=$NODEWKS/app/node-v18.19.0-linux-x64 export PATH=$NODE_BASE/bin:$PATH export NODE_GLOBAL=$NODE_BASE/global export PATH=$NODE_GLOBAL/bin:$PATH . ~/.bashrc $ which node /wks/nodejs/app/node-v18.19.0-linux-x64/bin/node 下面的设置会替代NODE_PATH的作用 mkdir -p $NODE_BASE/{global,cache} npm config set prefix "$NODE_BASE/global" npm config set cache "$NODE_BASE/cache" npm install -g npm@10.2.5 npm install -g yarn 下面的根据需要安装,不需要就不用设置 yarn config set -g registry http://mirrors.cloud.tencent.com/npm/ yarn config set -g sass_binary_site http://mirrors.cloud.tencent.com/npm/node-sass/
ubantu20,gcc12,python3 v20.9编译安装
node20要求gcc10,glic2.28,python3, 但sass要求Python2,但同时ubantu20已不支持python2了 不用sass的可以用这个方案 wget https://nodejs.org/dist/v20.9.0/node-v20.9.0.tar.gz tar -xvf node-v20.9.0.tar.gz cd node-v20.9.0 mkdir /wks/nodejs/app/node20 # ./configure --prefix=/wks/nodejs/app/node20 make make install 下面的设置会替代NODE_PATH的作用 mkdir -p /wks/nodejs/app/node20/{global,cache} npm config set prefix "/wks/nodejs/app/node20/global" npm config set cache "/wks/nodejs/app/node20/cache" npm install -g yarn 下面的根据需要安装,不需要就不用设置 yarn config set -g registry http://mirrors.cloud.tencent.com/npm/ yarn config set -g sass_binary_site http://mirrors.cloud.tencent.com/npm/node-sass/ NODE_GLOBAL就是上面global的路径,将全局安装的包加到PATH路径中 将npm的版本降到8.5.5这个解决兼容python,让node可以兼容python3 npm install -g npm@8.5.5 vim ~/.bashrc export NODEWKS=/wks/nodejs export NODE_BASE=$NODEWKS/app/node20 export PATH=$NODE_BASE/bin:$PATH export NODE_GLOBAL=$NODE_BASE/global export PATH=$NODE_GLOBAL/bin:$PATH . ~/.bashrc $ npm -v 8.5.5
centos7,gcc10,python2+python3
centos7属于老一代,就是我那个时代的产物,比较稳定,升级一下gcc还能用,目前很多软件还是依赖于这个环境的 这里使用codna安装一个Python3,可以方便创建各种python版本的环境 cat centos-7-x86_64.tar.gz |docker import - cent7 docker run -itd --privileged --name nd -h nd --net=host -v /tmp:/tmp cent7 bash alias nd="docker exec -it nd bash" yum install -y net-tools libaio numactl gcc gcc-c++ autoconf make openssl-devel bzip2-devel ### gcc 升级 yum install centos-release-scl yum install devtoolset-10-gcc* /usr/bin/scl enable devtoolset-10 bash adduser xt vim /etc/sudoers.d/xt %xt ALL=(ALL) NOPASSWD:ALL mkdir -p /wks/nodejs/app chown -R xt.xt /wks sudo mkdir -p /ai/app chown -R xt.xt /ai cd /ai/app cp /tmp/Anaconda3-2022.10-Linux-x86_64.sh ./ su - xt cd /ai/app sh Anaconda3-2022.10-Linux-x86_64.sh [/home/xt/anaconda3] >>> /wks/app/anaconda3 exit su - xt cd /wks/nodejs/app/ wget https://nodejs.org/dist/v14.21.3/node-v14.21.3-linux-x64.tar.xz tar -xvf node-v14.21.3-linux-x64.tar.xz vim ~/.bash_profile export NODEWKS=/wks/nodejs export NODE_BASE=$NODEWKS/app/node-v14.21.3-linux-x64 export PATH=$NODE_BASE/bin:$PATH export NODE_GLOBAL=$NODE_BASE/global export PATH=$NODE_GLOBAL/bin:$PATH . ~/.bash_profile $ which node /wks/nodejs/app/node-v14.21.3-linux-x64/bin/node 下面的设置会替代NODE_PATH的作用 mkdir -p $NODE_BASE/{global,cache} npm config set prefix "$NODE_BASE/global" npm config set cache "$NODE_BASE/cache" npm install -g yarn 下面的根据需要安装,不需要就不用设置 yarn config set -g registry http://mirrors.cloud.tencent.com/npm/ yarn config set -g sass_binary_site http://mirrors.cloud.tencent.com/npm/node-sass/ 将npm的版本降到8.5.5这个解决兼容python,让node可以兼容python3 npm install -g npm@8.5.5 . ~/.bash_profile $ npm -v 8.5.5
yo 框架
https://www.npmjs.com/package/generator-express mkdir /opt/blog cd /opt/blog yarn global add yo@4.3.1 yarn global add generator-express@2.17.2 yarn global add npm-check 以上三个包建议使用全局安装 添加环境变量 vim ~/.bash_profile export PATH=/wks/blog/node_modules/.bin:$PATH . ~/.bash_profile yo express (base) [xt@py1 blog]$ yo express ? Would you like to create a new directory for your project? No ? Select a version to install: Basic ? Select a view engine to use: Pug ? Select a css preprocessor to use: Sass ? Select a build tool to use: Gulp
npm-check检测最新依赖包安装
npm-check -u 按空格 选中,全部更新 (base) [xt@py1 blog]$ npm-check -u ? Choose which packages to update. Major Update Potentially breaking API changes. Use caution. ◉ pug 2.0.4 ❯ 3.0.2 https://pugjs.org ◉ chai devDep 3.5.0 ❯ 4.3.7 http://chaijs.com ◉ debug devDep 2.6.9 ❯ 4.3.4 https://github.com/debug-js/debug#readme ◉ gulp devDep 3.9.1 ❯ 4.0.2 https://gulpjs.com ◉ gulp-sass devDep 3.2.1 ❯ 5.1.0 https://github.com/dlmanning/gulp-sass#readme ◉ gulp-livereload devDep 3.8.1 ❯ 4.0.2 https://github.com/vohof/gulp-livereload#readme ◉ mocha devDep 4.1.0 ❯ 10.2.0 https://mochajs.org/ ◉ nyc devDep 10.3.2 ❯ 15.1.0 https://istanbul.js.org/ ❯◉ supertest devDep 2.0.1 ❯ 6.3.3 https://github.com/visionmedia/supertest#readme
Glob用于匹配文件并读取
https://www.npmjs.com/package/glob Match files using the patterns the shell uses. // load using import import { glob, globSync, globStream, globStreamSync, Glob } from 'glob' // or using commonjs, that's fine, too const { glob, globSync, globStream, globStreamSync, Glob, } = require('glob') // or default export is fine too, just returns the glob function // with all the aliases attached. import glob from 'glob' // or using commonjs const glob = require('glob') // the main glob() and globSync() resolve/return array of filenames // all js files, but don't look in node_modules const jsfiles = await glob('**/*.js', { ignore: 'node_modules/**' }) // pass in a signal to cancel the glob walk const stopAfter100ms = await glob('**/*.css', { signal: AbortSignal.timeout(100), }) // multiple patterns supported as well const images = await glob(['css/*.{png,jpeg}', 'public/*.{png,jpeg}']) // but of course you can do that with the glob pattern also // the sync function is the same, just returns a string[] instead // of Promiseconst imagesAlt = globSync('{css,public}/*.{png,jpeg}') // you can also stream them, this is a Minipass stream const filesStream = globStream(['**/*.dat', 'logs/**/*.log'])
A toolkit to automate & enhance your workflow https://gulpjs.com/ https://gulpjs.com/docs/en/getting-started/quick-start gulp的作用就是在启动项目时执行一些自定义的命令 gulp4.0之前使用task方法,4.0之后不再使用,项目初始化时使用的gulp3, 更新为 gulp4之后,需要修改gulpfile.js文件 $ npm -v 6.14.13 $ npx -v 6.14.13 $ which gulp /opt/blog/node_modules/.bin/gulp $ gulp -version CLI version: 2.3.0 Local version: 4.0.2
gulp4示例
备份一下/opt/blog目录下的gulpfile.js文件,创建一个新的gulpfile.js文件,写入以下内容 function mycode(){ let a = 1; let b = 2; console.log("my code: a+b=",a+b); } function defaultTask(cb) { // place code for your default task here mycode(); cb(); } exports.default = defaultTask 然后在项目目录下执行gulp $ gulp [03:31:16] Using gulpfile /opt/blog/gulpfile.js [03:31:16] Starting 'default'... my code: a+b= 3 [03:31:16] Finished 'default' after 1.52 ms
gulp4将图片从开发目录同步到另外一个目录
const gulp = require('gulp'); const nodemon = require('gulp-nodemon'); const plumber = require('gulp-plumber'); const livereload = require('gulp-livereload'); //-------------------img------------------------------------------------- function img(cb){ gulp.src('./src/img/*.*') .pipe(gulp.dest('./public/img/')) .pipe(livereload()); cb(); } function watch(cb){ gulp.watch('./src/img/*.*', gulp.parallel(img)); cb(); } function develop(cb){ livereload.listen(); nodemon({ script: 'app.js', ext: 'js coffee pug', stdout: false }).on('readable', function () { this.stdout.on('data', (chunk) => { if (/^Express server listening on port/.test(chunk)) { livereload.changed(__dirname); } }); this.stdout.pipe(process.stdout); this.stderr.pipe(process.stderr); }); cb(); } //在项目启动前并行处理一系列方法 exports.default = gulp.parallel(img, watch, develop);
Babel 是一个 JavaScript 编译器, 将ES6转换为浏览器识别的JS语法 https://www.npmjs.com/package/Babel 中文网站 https://www.babeljs.cn/
cd /opt/blog 静态文件目录 mkdir -p src/{js,css,img}
https://www.npmjs.com/ fontawesome-free https://www.npmjs.com/package/@fortawesome/fontawesome-free npm i @fortawesome/fontawesome-free // 静态资源设置 app.use('/fontawesome', express.static(config.root + '/node_modules/@fortawesome/fontawesome-free'));
npm i jquery https://www.npmjs.com/package/jquery // 静态资源设置 app.use('/jquery', express.static(config.root + '/node_modules/jquery/dist'));
// 静态资源设置 app.use('/bootstrap', express.static(config.root + '/node_modules/bootstrap/dist'));
https://pugjs.org/api/getting-started.html npm install pug app.set('view engine', 'pug'); //- template.pug p #{name}'s Pug source code!
//- layout.pug html head title My Site - #{title} block scripts script(src='/jquery.js') body block content block foot #footer p some footer content
extends,include
//- page-a.pug extends layout.pug block scripts script(src='/jquery.js') script(src='/pets.js') block content h1= title - var pets = ['cat', 'dog'] each petName in pets include pet.pug
Block append / prepend
Pug allows you to replace (default), prepend, or append blocks.
//- layout.pug html head block head script(src='/vendor/jquery.js') script(src='/vendor/caustic.js') body block content
//- page.pug extends layout.pug block append head script(src='/vendor/three.js') script(src='/game.js')
When using block append or block prepend, the word “block” is optional:
//- page.pug extends layout append head script(src='/vendor/three.js') script(src='/game.js')
layout在上级目录及class的添加
extends ../layout append css link(rel='stylesheet', href='/css/blog/index.css') block content include ../include/nav.pug .container .row div(class=['col-x1-1','col-lg-2']) ul.list-group a.list-group-item.list-group-item-action(href='#') 热门博客