javascript包管理工具npm、pnpm、webpack

news/2024/5/2 14:16:34/文章来源:https://blog.csdn.net/qq_54517101/article/details/127910682

目录

npm 

 package.json

常见的属性

 main属性

scripts属性

dependencies属性

devDependencies属性

其他属性

 依赖版本管理

package-lock.json 

npm install 原理 

 npx

webpack

 内置模块path​编辑

基本使用 

  css-loader

 postcss-loader

postcss-preset-env 

 webpack打包图片

label

vue-loader

resolve:extensions

插件plugin

CleanWebpackPlugin

HtmlWebpackPlugin

 DefinePlugin

webpack搭建本地服务器

模块热替换HMR

pnpm

基本介绍

硬链接和软链接

pnpm创建 非扁平化node_moduls目录

基本使用

最基本的用法与npm对照

 pnpm存储


npm 

node package manger

npm install XXX

使用npm安装,会生成一个node_modules文件夹,然后将下载的东西放进去

除了这个文件夹,还有两个文件package-lock.json   package.json

 package.json

对于一个完整的项目来说,我们需要一个配置文件来记录这个项目的一些信息,例如项目名字,项目版本号,项目依赖的库等等

这个配置文件就是我们的package.josn

 第一种方法就是直接在cmd中输入  npm init  就可以,它会一步一步提示你完成

内容大概有

{"name": "why","version": "1.0.0","description": "","main": "mian.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "","license": "ISC"
}

第二种方法是脚手架CLI  

常见的属性

 main属性

之前说过,如果在js文件中直接引用const name = require('why'),它会先在该文件上一层文件中找node_modules文件夹,然后在里面找why文件夹,再在下面找index.js

但是如果why文件夹下面不是index.js,显然就会报错

如果why文件夹下面有一个main.js(反正不叫index.js),但是还有一个package.json,那么就会先读取这个package.json,看看里面是否有main属性,然后通过这个mian属性找到why文件夹入口,就可以指定运行 这个不叫index.js的文件

package.json(),根据这个mian的内容决定要从哪里开始运行,注意这个文件是放在why文件夹下的

{"name": "why","version": "1.0.0","description": "","main": "mian.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "","license": "ISC"
}

scripts属性

对于这个文件夹

 如果在根目录learn下,我想运行src下的main.js,那么我得输入node src/main.js

但是在learn文件夹下的package.json中的scripts写入

"scripts": {"start": "node ./src/main.js","test": "echo \"Error: no test specified\" && exit 1"//这个是自带的},

那么只需要输入npm run start就可以运行src下的main.js

dependencies属性

 dependencies记录了依赖的包

在真实开发中,如果想要共享代码给别,一般不会把node_modules文件夹压缩给别人,因为可能这个文件夹很大,不方便压缩发送

那么可以利用 dependencies属性,只需要输入 npm install  就可以下载所有依赖的包

devDependencies属性

开发依赖

也就是说一些包 ,只是在开发过程中用到了,在之后的使用过程中不需要了,例如webpack,我们只需要在开发时用他进行打包,打包完之后就不需要了

那么在下载的时候就需要对其进行声明

npm install XXX --save-dev   或者   npm install XXX -D

其他属性

 

 依赖版本管理

package-lock.json 

记录使用的包的具体版本(精确的版本),以防止代码共享时的版本混乱的问题

npm install 原理 

 npx

如果使用npm install webpack 安装包之后

包都是安装在在node_modules下,这个时候在控制台输入webpack --version,会找不到,因为它不会往下查找,只会在learn文件夹下找是否有webpack,而不会进入node_modules

如果它找不到,就会去全局找webpack,如果想在全局下安装包,应该使用npm i webpack -g

如果使用npx webpack --version就可以在node_modules找到对应的版本

同样的  如果要使用包 例如webpack,如果直接输入webpack执行,则会执行全局版本(如果没有全局版本则报错),如果使用npx webpack则会使用node_modules下的版本

但是 ,如果在package.json中的script中建立     "built":"webpack" 那么直接在控制台输入  npm run built 是ok的,会直接使用node_modules下的版本

webpack

 内置模块path

 直接使用即可 不需要下载

const path = require('path')
const file = 'C:/aaa/bbb/ccc.txt'
console.log(path.basename(file));
console.log(path.dirname(file));
console.log(path.extname(file));

 ccc.txt
C:/aaa/bbb
.txt

路径拼接

const file1 = '../why/ccc.js'
const file2 = 'C:/aaa/bbb/'
console.log(path.join(file2,file1));

C:\aaa\why\ccc.js

拼接的绝对路径

这个方法一定会返回绝对路径,如果没有找到,则以当前文件的路径进行拼接

console.log(path.resolve('abc/sss','qsa.ww','sdd/ss.txt'));

 L:\XXXXXX\src\abc\sss\qsa.ww\sdd\ss.txt

顺序是从右到左,如果找到了绝对路径就会立即输出,/ 看成就是绝对路径的标志

console.log(path.resolve('abc/sss','/qsa.ww','sdd/ss.txt'));

L:\qsa.ww\sdd\ss.txt

基本使用 

概念 | webpack 中文文档

在开发过程中会用到很多包或者框架,例如vue,在编写的时候为了方便可能会有许多奇奇怪怪的文件,比如.vue .jxs等等,但是这些东西服务器和浏览器是不认识的

所以需要打包工具将所有东西打包为html  css js

下载需要webpack  与 webpack-cil一起下载

npm i webpack webpack-cil -D

 一般来说直接在命令行输入  npx webpack 就可以 生成一个dist文件夹,此文件夹下面是main.js

 我在运行这里的时候遇到一个bug,说是找不到src文件夹,显然运用webpack打包时需要把js文件放在src文件夹下,js文件的名字是index.js,且此名称是固定的

上述的文件名都是默认配置,如果想改变这些,可以自己定义一个webpack配置文件

在project文件夹下创建  webpack.config.js 文件,然后还是直接npx webpack,当然如果你不想叫 webpack.config.js ,那么可以  npx webpack --config xxxx.js

const path = require('path')module.exports = {entry:'./src/main.js',//导入文件的路径output:{filename:'aaa.js',//输出文件名path:path.resolve(__dirname,'./ccc')//输出的文件夹名字,必须为绝对路径}
}

可以定义打包的文件输入接口,还有打包的输出

  css-loader

webpack在打包时很多文件是不认识的,初始只认识js文件,当他碰到不认识的文件,例如.css文件 .vue文件时,就需要被告知解析这种文件需要什么方法,也就是需要什么loader

这些信息都在config.js中配置

const path = require('path')module.exports = {entry:'./src/main.js',//导入文件的路径output:{filename:'aaa.js',//输出文件名path:path.resolve(__dirname,'./ccc')//输出的文件夹名字,必须为绝对路径},module:{rules:[{test:/\.css$/,  //正则  以.css结尾use:[{loader:'style-loader'},//从后往前执行{loader:'css-loader'}]}]}
}

这里主要是增加了model模块

rules是对文件的解析规则进行了声明

test表示匹配,这里采用正则表达式,也就是说当匹配到以 .css文件结尾的文件时才会执行这个规则

use表示匹配成功后的解析规则,这里用到了两个loader,分别是css-loader,这个是将css文件进行解析,是第一步,第二步是将css代码部署到html中,用到的是style-loader,由于这里是从后往前执行的,所以先写style-loader

一般来说,会在初级文件夹下建立component文件夹放js文件,style文件夹下放css文件

然后在component文件夹下js的文件引入css文件

import '../style/ddiv.css'

最后在src文件夹下面的main.js文件下引入js文件

import '../component/ddiv.js'

这样的目的是在打包时,webpack能顺着  main.js ->js->css 一路搜索到文件并进行打包

 less文件类似

        rules:[{test:/\.css$/,  //正则  以.css结尾use:[{loader:'style-loader'},{loader:'css-loader'}]},{test:/\.less$/,use:['style-loader','css-loader','less-loader']}]

 postcss-loader

对css进行一些处理的loader

例如autoprefixer ,可以自动给某些css语句加浏览器前缀

用法:

例如我在css中添加user-select,这个属性是有限制的,一般要加浏览器前缀,可以使用autoprefixer自动添加

当然这个插件需要下载   npm i autoprefixer -D

.content{width: 100px;height: 100px;background-color: pink;user-select: none;
}

先在webpack.config.js写

            {test:/\.css$/,  //正则  以.css结尾use:['style-loader','css-loader','postcss-loader']},

 然后在根目录下新建文件  postcss.config.js

module.exports = {plugins: ['autoprefixer']
}

 也可以直接在webpack.config.js写

            {test:/\.css$/,  //正则  以.css结尾use:[{loader:'style-loader'},{loader:'css-loader'},{loader:'postcss-loader',options:{postcssOptions:{plugins: ['autoprefixer']}}}]},

postcss-preset-env 

也就是说这个东西集成了很多插件预设,使用这个就可以使用很多功能(推荐)

            {test:/\.css$/,  //正则  以.css结尾use:[{loader:'style-loader'},{loader:'css-loader'},{loader:'postcss-loader',options:{postcssOptions:{plugins: ['postcss-preset-env']}}}]},

 webpack打包图片

 js文件:

import '../style/ddiv.css'
import girlImg from '../img/aaa.png'//导入图片const imgg = document.createElement('img')
// imgg.classList.add('content')
imgg.src = girlImg
document.body.append(imgg)

webpack.config.js中配置:

            {test:/\.(png|jpg|jpeg|svg|gif)$/,type:'asset'}

 type有四种,对应四种解析方式

第一种 asset/resource 会将原图片下载下来重命名放到打包文件中

缺点是需要一次网络请求才能完成图片嵌入 

第二种  asset/inline 会见图片进行base64直接嵌入到js中,缺点是导致js文件很大

可以规定图片大小

            {test:/\.(png|jpg|jpeg|svg|gif)$/,type:'asset',parser: {dataUrlCondition: {maxSize: 4 * 1024 // 4kb}}}

还可以自定义输入文件名

            {test:/\.(png|jpg|jpeg|svg|gif)$/,type:'asset',parser: {dataUrlCondition: {maxSize: 4 * 1024 // 4kb}},generator: {filename: 'abc.png'}}

 一般会使用

                    filename: '[name]_[hash:8][ext]'

表示 [原来的名字]_[保留8位哈希值][原来的后缀名] 

这些属性都可以通过查官方文档得到

资源模块 | webpack 中文文档

label

 Babel,又名Babel.js。 是一个用于web 开发,且自由开源的JavaScript 编译器、转译器。 Babel 使软件开发者能够以偏好的编程语言或风格来写作源代码,并将其利用Babel 翻译成JavaScript。 Babel 是一个常用来使用最新的JavaScript 语言特性的工具。——维基百科

其实说白了就是将es6 等有浏览器兼容问题的高级语法转换为es5语法

当然与postcss-loader相似,这个也有很多插件,一般用预设插件

npm i babel-loader -D

 npm i @babel/preset-env -D

            {test:/\.js$/,use:[{loader:'babel-loader',options:{presets: [['@babel/preset-env']]}}]}

vue-loader

const path = require('path')
const {VueLoaderPlugin} = require('vue-loader/dist/index')module.exports = {entry:'./src/index.js',//导入文件的路径output:{filename:'aaa.js',//输出文件名path:path.resolve(__dirname,'./ccc')//输出的文件夹名字,必须为绝对路径},module:{rules:[{test:/\.vue$/,use:[{loader:'vue-loader'}]}]},plugins:[new VueLoaderPlugin()]
}

const {VueLoaderPlugin} = require('vue-loader/dist/index')

是必须的,将插件引入最后在plugins使用插件

resolve:extensions

在使用require导入文件时,如果后缀名是.js 或者.json,就可以不需要加后缀名,因为webpack会自动补齐

这里是因为其内部有resolve:extensions规则,也可以自己设定自动补齐的文件格式

在webpack.config.js中加入

    resolve:{extensions:['.js','.json','.vue','.jsx','.tx','.tsx']},

 也就说在reuqire这六种文件的时候可以不需要加后缀名

插件plugin

CleanWebpackPlugin

添加插件的方式

先下载插件    npm i clean-webpack-plugin -D

在webpack.config.js中引入插件

const {CleanWebpackPlugin} = require('clean-webpack-plugin')

最后配置 ,类似于vue-loader中插件的用法

    plugins:[new CleanWebpackPlugin(),],

这个插件的作用是在打包时自动删除其他没用的文件

例如在打包后的导入的文件夹ccc下手动创造一个文件,那么在重新打包后会把这个文件删除,因为这个文件跟打包是没有关系的

HtmlWebpackPlugin

是一个能在打包时生成html文件的插件

引入方式一样

const HtmlWebpackPlugin =require('html-webpack-plugin')
    plugins:[new CleanWebpackPlugin(),new HtmlWebpackPlugin(),],

 生成html的title是自带的,也可以自己设置

        new HtmlWebpackPlugin({title:'XXXX'}),

这里的html是新生成的,其原理是用到了一个自带的模板,如果想自己改为其他的模板,可以:

        new HtmlWebpackPlugin({title:'XXXX',template:'./index.html'}),

 DefinePlugin

这个不需要下载,是webpack里面自带的

可以设置全局变量,在任何地方都可以使用

const {DefinePlugin} = require('webpack')

在plugins中:

        new DefinePlugin({base:"'why'",hhh:'123'})

 这里就指定了两个全局变量  base  和 hhh

这里base需要两个引号的原因是,如果只有一个引号,那么会将引号内的看做js代码执行,例如我写  base:"1+1",我的本意是将base定义为字符串 1+1 ,但是这里会自动执行,使得base定义为2

如果 base:“why”,那么默认是将why这个变量传给base

webpack搭建本地服务器

 之前的操作中,如果我们改变了代码,那么每次都要重新打包运行,才能看到运行结果,这种开发效率很慢

可以使用webpack-dev-server插件自己搭建一个本地服务器,可以做到每次改变代码可以自动打包运行显示,提升了开发效率

且其自动打包不会再生成打包文件,即不讲打包文件放在硬盘中,而是将其放在内存中,以提升运行速度

首先下载

npm i webpack-dev-server-D

然后直接在命令行运行

npx webpack serve

 从第一个8080端口进去,就是本地的服务器创造的html

每次改变代码,保存即可自动刷新

当然也可以直接设定端口地址

在webpack.config.js里面写

    devServer:{port:8888},

模块热替换HMR

 手动设置这个有点麻烦 ,一般框架是会自动设置这个的,做个了解就行了

pnpm

基本介绍

首先上述方法有一个痛点

如果我电脑里面有很多个project,每个里面都用到了很多包,例如vue等等,有很多包是重复的

但是按照上面的方法,需要每个project都去安装对应的包,这会造成浪费

pnpm解决了这个问题

硬链接和软链接

首先说一下硬链接和软链接的关系

硬链接是多个文件同时指向同一个硬盘数据,(不是拷贝)

软链接是创造一个文件A,此文件放的是另外一个文件B的路径,B指向硬盘数据,最典型的是快捷方式

 

 那pnpm就是可以创建硬链接

当我有很多工程都用到了同一个包时,例如vue,pnpm会为每一个工程创造一个硬链接指向硬盘中的vue文件,所以不管怎么增加工程,vue文件在硬盘中始终只有一个

pnpm创建 非扁平化node_moduls目录

 使用npm安装包的时候,会将所有的包都放在node_moduls文件夹下

例如这里我只安装了一个webpack,但是文件夹里面有很多其他包,是因为webpack包还依赖于其他的包,例如ajv,这就是扁平化 node_moduls目录

这样有什么问题呢

那就是我在引入的时候,可以在代码直接引入 ajv包,这样是有问题的,因为我只下载了webpack包,且package.json里面并没有包含ajv包的信息。理所当然的我希望只能引用webpack包才对

所以pnpm引入非扁平化 node_moduls目录

使用 pnpm add webpack  下载

可以发现其node_modules下没有一堆文件了,webpack的依赖包都放在了webpack文件夹下

但是这里的webpack文件夹是一个快捷方式(软链接),真实文件在.pnpm文件夹下:

然后在这个文件夹下还有一个node_modules ,放入webpack本身的硬链接,还有依赖包的软链接,依赖包的真实文件也在.pnpm文件夹下,以此类推

基本使用

最基本的用法与npm对照

 pnpm存储

使用pnpm添加包,会给每个工程创建一个硬链接,其是pnpm也会创造一个硬链接,用于记录已经下载过了那些包

这个文件一般是叫 pnpm-store

这里有一个问题,如果有一个包,之前用过,后面把项目删除了, pnpm-store里面的硬链接是不会删除的,这会造成空间浪费

使用pnpm store prune裁剪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_228558.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计Django付费自习室管理小程序

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

Express 3 快速入门 - Express 应用程序生成器

Express Express 中文网 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录Express3 快速入门 - Express 应用程序生成器3.1 演示3.2 重新创建myapp Express 应用3 快速入门 - Express 应用程序生成器 3.1 演示 通过应用生成器工具 express-gene…

【测试面试】测试开发面试算法高频题,这些题你会多少?

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 测试开发是近几年行…

您的推特营销选对群控了吗

作为跨境电商从业者,我们都知道,如果平台检测到违规,最多的是多账号关联。平台怎么判定我们的账号是否关联呢?一个重要的依据是浏览器的指纹信息。 一、进行站外引流的困难有哪些: 国内用户在推广海外社交媒体时&…

02【SpringMVC的工作流程】

文章目录二、SpringMVC的工作流程2.1 SpringMVC的三大组件2.1.1 HandlerMapping:2.1.2 HandlerAdapter:2.1.3 ViewResolver:2.2 SpringMVC源码分析2.2.1 准备工作2.2.2 查看DispatcherServlet的继承体系:2.2.3 通过映射器获取执行…

Apifox很难不爱

一、背景 项目开发我们都知道在一个项目团队中是由很多角色组成,最常见团队的就是前端开发工程师、客户端开发工程师、服务端开发工程师组成一个团队,团队之间进行合作,一般我们都离不开API接口管理和测试,API接口管理可以理解为前…

高等数学基础概念的Python开发实现

一般的数学算式math函数库就可以解决了,如果是涉及到高等数学极限,微积分等知识,就需要用到sympy科学计算库,它是专门用来解决数学的运算问题的。 Sympy是一个符号计算的Python库。它的目标是成为一个全功能的计算机代数系统&…

基于非支配排序遗传算法的多目标水光互补优化调度附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

产品经理必备的能力有哪些?

从一名普通的产品经理到一名优秀的产品经理要经历什么?哪些又是产品经理必备的能力?产品经理对能力的需求也不尽相同,在不同的团队合作模式下,还必须懂得各种能力。 一、业务分析能力 数据分析能力该是什么样的呢 1、有数据意识…

SCP命令在不同远程服务器之间发送文件(指定端口)

最近想把数据集放在另一个服务器上,但是如果先下载到本地然后再上传过去,则需要浪费好久时间。 特总结下如何快捷的通过命令完成不同远程服务器之间的文件传输,以及遇到的问题。 SCP命令 Linux scp 命令用于 Linux 之间复制文件和目录。1 s…

JavaCV音视频开发宝典:rtsp转推到rtp(非TS流方式),及使用TS流发送解决sdp缺失问题

《JavaCV音视频开发宝典》专栏目录导航 《JavaCV音视频开发宝典》专栏介绍和目录 前言 在之前的文章中,由于忘记介绍使用的rtp推流方式都是TS流方式,RTP方式推流没讲,本章作为之前文章(JavaCV音视频开发宝典:rtsp拉流并使用转码方式转推到rtp)的补充。 注意:本文不需要…

Java+JSP+MySQL基于SSM的在线投票系统-计算机毕业设计

项目介绍 随着社会的发展,人们在处理一些问题的时候不同意见越来越多,这源于人们对思想的解放和对社会的认识。所以在处理同一问题上,为了征求不同人的意见在线投票系统诞生了。 基于SSM的在线投票系统以钦州学院为背景,运用在校…

论文投稿指南——中文核心期刊推荐(计算机技术)

>>>深度学习Tricks&#xff0c;第一时间送达<<< &#x1f680; 写在前面 &#x1f431;‍&#x1f3cd; 本期开始&#xff0c;小海带会定期推荐各专业领域的中文核心期刊及论文投稿网址&#xff0c;供大家参考交流 ~ 《中文核心期刊要目总览》是学术界对某…

微信开发者工具 / 反编译工具CrackMinApp 下载安装

微信开发者工具 / 反编译工具CrackMinApp 下载安装 文章目录微信开发者工具 / 反编译工具CrackMinApp 下载安装前言一、微信开发者工具下载安装二、反编译工具CrackMinApp安装三、导入反编译后的文件四、友情提示总结前言 微信开发者工具介绍&#xff1a;微信提供的微信小程序…

一篇个人陈述应该包括这三个内容

大家好呀&#xff0c;申请季正如火如荼地进行着&#xff0c;不知道大家都忙碌得怎么样了呢&#xff1f;今天我们来聊聊个人陈述Personal statement,的撰写&#xff0c;包括一篇个人陈述应该包括哪些部分。 申请时&#xff0c;除了学习成绩等“硬背景”&#xff0c;个人陈述(PS…

[SpringMVC]第三篇:作用域传参

四大域: PageContext对象(不常用) 作用域范围:当前jsp页面内有效 request对象(经常用) 作用域范围:一次请求内。 作用: 解决了一次请求内的资源的数据共享问题 session对象(登录,会话时会用) 作用域范围:一次会话内有效。 说明:浏览器不关闭,并且后台的session不失效&#xff…

内容、文档和流程数字化如何支持精益原则

内容、文档和流程数字化如何支持精益原则 无论您身处哪个行业&#xff0c;想要在业务中取得真正的成功就必须把客户放在所有决策的中心位置&#xff0c;以便您能够给客户提供最佳服务。同时公司以最高效的方式向前发展也很重要。幸运的是&#xff0c;有一种方法可以确保两者兼而…

Java企业微信对接

最近项目中要对接企业微信&#xff0c;实现通讯录数据同步&#xff0c;即在企业端添加编辑删除用户&#xff0c;部门数据要同步到微信端&#xff0c;同时微信端添加编辑删除用户&#xff0c;部门数据要同步到企业端&#xff0c;实现数据同步功能&#xff0c;需要调用企业微信AP…

五款朴实无华却又能极大提升办公效率的软件

最近后台收到好多小伙伴的私信&#xff0c;今天继续推荐五款小工具&#xff0c;都是免费使用的&#xff0c;大家可以去试试看。 1.光追动画制作——Luxion KeyShot Luxion KeyShot是一款互动性的光线追踪与全域光渲染3D渲染与动画制作软件&#xff0c;内置丰富多样的材质&…

mybatis实战:三、mybatis多表查询的映射

依照上一期的继续 1.UserMapper.xml 除了直接对应基本数据类类型、表的实体类&#xff0c;还可能用到多表查询。 <select id"selectRolesByUserId" resultType"tk.mybatis.simple.model.SysRole">select r.id, r.role_name roleName, r.enabled, r…