vue项目的前端工程化思路webpack(持续更新中)

写在前面:现在的前端网页功能丰富,特别是SPA(single page web application 单页应用)技术流行后,JavaScript的复杂度增加和需要一大堆依赖包,还需要解决Scss,Less……新增样式的扩展写法的编译工作。前端工程化,如WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Sass,TypeScript等),并将其转换和打包为合适的格式供浏览器使用。在3.0出现后,Webpack还肩负起了优化项目的责任。

 为什么需要打包工具

前端工程化对提升开发效率,统一团队开发风格,具有重要的意义。从业务代码中脱离出来,以架构的角度去看待整个项目的打包、编译、运行。打包工具做的就是将模块化的代码转换为浏览器可以识别的代码

 前端工程化的作用

从代码层面来说:

  • 体积更小(Tree-shaking、压缩、合并),加载更快

  • 编译高级语言和语法(TS、ES6、模块化、scss)

  • 兼容性和错误检查(polyfill,postcss,eslint)

从研发流程层面:

  • 统一、高效的开发环境

  • 统一的构建流程和产出标准

  • 集成公司构建规范(提测、上线)

 vue项目搭建思路

 代码文件目录

 构建工具VueCLI

webpack、vue/cli-service、vite构建工具对比

1. webpack VS vue/cli-Service

vue/cli-service 是 Vue CLI 提供的构建工具,而 webpack 是一个独立的静态模块打包工具,Vue 项目可以通过 Vue CLI 集成 webpack 来进行构建。Vue 3 和 Vue 2 都可以使用 webpack 作为打包工具。

  1. vue/cli-service 是 Vue CLI 提供的一个构建工具,用于帮助开发者快速搭建和管理 Vue 项目。它提供了一系列的命令和配置选项,可以帮助开发者进行项目的开发、构建、调试和部署等工作。vue/cli-service 是基于 webpack 进行封装和集成的,可以简化 webpack 的配置和使用。

  2. webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。它可以将各种资源,如 JavaScript、CSS、图片等,视为模块,并通过依赖关系将它们打包成静态资源。webpack 提供了丰富的插件和加载器,可以帮助开发者处理各种复杂的场景,如代码拆分、懒加载、压缩等。

对于 Vue 3 和 Vue 2,它们都可以使用 webpack 作为打包工具。在 Vue CLI 3.x 版本中,默认使用 webpack 作为打包工具,因此 Vue 3 和 Vue 2 项目都可以通过 Vue CLI 来构建和管理。Vue CLI 4.x 版本及以上也是基于 webpack 的。

vue.config.js

vue.config.js 是 Vue CLI 项目中用来配置构建工具的文件,主要用于配置 Vue 项目的构建过程和开发服务器的行为。通过这个文件,可以修改 webpack 的配置,添加插件,配置开发服务器等。它是基于 Vue CLI 的默认构建工具 webpack 的配置文件。

在 Vue 项目中,`vue.config.js` 是一个特殊的配置文件,用于配置 Vue 项目的构建配置和开发服务器配置。这个文件会被 `@vue/cli-service` 自动加载,用于覆盖默认的 webpack 配置。

 文件配置示例

const { defineConfig } = require("@vue/cli-service");

module.exports = defineConfig({
  transpileDependencies: true,
  productionSourceMap: false,
  lintOnSave: false,
  pluginOptions: {
    windicss: {
      preflight: false,
    },
  },
  css: {
    loaderOptions: {
      less: {
        additionalData:
          '@import "@/design/variable.less";@import "@/components/style/index.less";',
      },
    },
  },
  devServer: {
    port: 8080, // 端口号
    open: true, // 自动打开浏览器
    compress: true, // 是否启用 gzip 压缩
    hot: true, // 热更新
    client: {
      overlay: false,
    },
    proxy: {
      "/basic-api/api": {
        // target: "https:**m/api", //正式环境API
        changeOrigin: true,
        pathRewrite: {
          "^/basic-api/api": "",
        },
      },
    },
  },
});

通过 `defineConfig` 方法定义了一些配置选项,这些选项会被合并到 webpack 配置中。让我们来看一下这些配置选项的作用:

1. `transpileDependencies: true`:允许对指定依赖进行转译,这些依赖会被 Babel 转译为 ES5 语法,以确保在旧版本浏览器中的兼容性。

2. `productionSourceMap: false`:在生产环境中禁用 source map,以减小构建文件的体积,提高构建性能。

3. `lintOnSave: false`:关闭保存时的代码检查,可以加快开发过程中的编译速度。

4. `pluginOptions`:配置一些插件选项,这里配置了 WindiCSS 插件的选项,设置了 `preflight: false`,表示禁用 WindiCSS 的预设样式。

5. `css.loaderOptions`:配置 CSS Loader 的选项,这里配置了 Less Loader 的选项,通过 `additionalData` 导入了额外的 Less 变量和样式文件。

6. `devServer`:配置开发服务器的选项,包括端口号、自动打开浏览器、是否启用 gzip 压缩、热更新等。还配置了代理,将 `/basic-api/api` 转发到不同的后端 API 地址,方便开发时与后端进行交互。

总的来说,`vue.config.js` 文件中的配置选项会影响 Vue 项目的构建和开发过程,通过这些配置可以定制化 webpack 构建过程和开发服务器的行为,以满足项目的特定需求。

 

 2.webpack VS Vite

 Vite 是一个基于现代浏览器原生 ES 模块导入的开发服务器,它使用了 TypeScript 来进行类型检查和编译。因此,在运行项目时,需要先进行 TypeScript 的类型检查,然后再使用 Vite 进行项目的构建。

  • Vite也是前端的构建工具

  • 相较于webpack,Vite采用了不同的运行方式:

    • 开发时,并不对代码打包,而是直接采用**ESM(ES模块)**的方式来运行项目
    • 在项目部署时,再对项目进行打包
  • 除了速度外,Vite使用起来也更加方便(开箱即用,都配置好了)

  • 本质上 Vite 和 Webpack 是打包工具,只是 Webpack 比较底层,需要自己手动去配置。

Vite 与 webpack 和 vue/cli-service 有一些区别,主要体现在以下几个方面:

  1. 构建方式:Vite 是一种基于 ES 模块的构建工具,它利用浏览器的原生 ES 模块导入特性,不需要像 webpack 那样将所有模块打包成一个文件。这使得 Vite 在开发环境下具有更快的热更新速度。而 webpack 和 vue/cli-service 则是传统的模块打包工具,需要将所有模块打包成一个或多个文件。

  2. TypeScript 支持:Vite 默认支持 TypeScript,可以直接在项目中使用 TypeScript 编写代码,并且会自动进行类型检查和编译。而 webpack 和 vue/cli-service 也支持 TypeScript,但需要额外配置。

  3. 开发体验:由于 Vite 的快速热更新和即时编译特性,开发者在使用 Vite 进行开发时会有更流畅的开发体验。而 webpack 和 vue/cli-service 在开发环境下可能会有较长的构建时间和热更新延迟。

总的来说,Vite 是一个专注于开发体验和构建速度的工具,适合用于快速原型开发和小型项目。而 webpack 和 vue/cli-service 则更适合于大型项目和复杂的构建需求

如何查看你自己项目用的哪个构建工具呢?

在package.json文件里,找到scripts脚本,查看 build的语法。实际开发环境中执行npm run build实际执行的是build后面替换的语句

3.webpack打包方式

4. vue-cli-service打包方式

5.vite打包方式

webpack

webpack主要作用将多个模块、文件、资源进行打包以便在浏览器中加载运行。主要作用:模块打包、依赖管理、代码转换和优化、开发环境支持如热更新、source-map等提高开发效率,其次webpack生态系统丰富,通过loaders和plugins可配置多种优化

webpack的核心概念

    Entry:入口,Webpack 执行构建的第一步将从 Entry 开始,可抽象成输入。告诉webpack要使用哪个模块作为构建项目的起点,默认为./src/index.js

    output :出口,告诉webpack在哪里输出它打包好的代码以及如何命名,默认为./dist

    Module:模块,在 Webpack 里一切皆模块,一个模块对应着一个文件。Webpack 会从配置的 Entry 开始递归找出所有依赖的模块。

    Chunk:代码块,一个 Chunk 由多个模块组合而成,用于代码合并与分割。

    Loader:模块转换器,用于把模块原内容按照需求转换成新内容。

    Plugin:扩展插件,在 Webpack 构建流程中的特定时机会广播出对应的事件,插件可以监听这些事件的发生,在特定时机做对应的事情。

模式(mode)

通过选择 development, productionnone 之中的一个,来设置 mode 参数,你可以启用 webpack 内置在相应环境下的优化。其默认值为 production

module.exports = {
  mode: 'production',
};

loader的作用

webpack 只能理解 JavaScript 和 JSON 文件,这是 webpack 开箱可用的自带能力。loader 让 webpack 能够去处理其他类型的文件,并将它们转换为有效 模块,以供应用程序使用,以及被添加到依赖图中。以下是webpack中常见的loader

使用步骤:

  1. 安装对应的 loader:npm i css-loader style-loader ts-loader -D

  2. 配置方式(推荐):

    • test 属性:识别出哪些文件需要被转换(使用正则表达式/\.css$/i
    • use 属性:定义出在进行转换时,使用哪个 loader(字符串、数组、对象)
    • type 属性:加载图像资源,设置为"asset/resource"
    • exclude 属性:不需要转换的文件夹(正则表达式)
    module.exports = {
      module: {	// 易漏点
        rules: [ 
          { test: /\.css$/, use: ['style-loader','css-loader'] },
          { test: /\.ts$/, use: 'ts-loader' },
          { test:/\.(jpg|png|gif)$/i,type:"asset/resource" },
        ],
      },
    };

    css-loader 只负责打包,style-loader 负责渲染生效【单一职责原则】

    loader 执行顺序为从后向前执行,因此 use 的数组顺序不能调换

配置里的module.rules数组配置了一组规则,告诉 Webpack 在遇到哪些文件时使用哪些 Loader 去加载和转换打包成js。

打包CSS——style-loader css-loader

npm add --dev style-loader css-loader

要先安装 npm add --dev style-loader css-loader

然后要在webpack.config.js里对需要引入的文件名进行配置,如css文件的配置如下

  module: {
    rules: [
      {
        test: /\.css$/i,
        use: ["style-loader", "css-loader"],
      },
    ],
  },

 打包图片——

 同理要配置图片文件则再写一个rules中的元素即可

对于以 .png.svg.jpg.jpeg.gif 结尾的文件,使用了 asset/resource 这个 asset 模块类型。asset/resource 类型会将匹配到的文件作为单独的文件输出,并返回文件路径。这意味着这些文件会被复制到输出目录,并且在 JavaScript 中返回最终的 URL 地址。

  module: {
    rules: [
      {
        test: /\.css$/i,
        use: ["style-loader", "css-loader"],
      },
      {
        test: /\.(png|svg|jpg|jpeg|gif)$/i,
        type: "asset/resource",
      },
    ],
  },

为什么使用 type 属性来定义处理文件的方式,这是因为 webpack 5 引入了新的 Asset 模块类型,用于处理静态资源文件。type: "asset/resource" 表示将匹配到的文件作为单独的资源文件处理,而不是将其打包成 base64 编码的 Data URL 或者使用 file-loader 进行处理。

通过使用 type 属性,可以更加灵活地定义不同类型文件的处理方式,包括将其作为资源文件、内联文件或者通过 URL 请求文件等。这样可以根据实际需求来选择最合适的处理方式,使 webpack 的打包配置更加灵活和高效。

 兼容低版本浏览器——babel-loader

  • 在编写js代码时,经常需要使用一些js中的新特性,而新特性在旧的浏览器中兼容性并不好。此时就导致我们无法使用一些新的特性。

  • 但是我们现在希望能够使用新的特性,我们可以采用折中的方案。依然使用新特性编写代码,但是代码编写完成时我们可以通过一些工具将新代码转换为旧代码。

  • babel就是这样一个工具,可以将新的js语法转换为旧的js,以提高代码的兼容性。

  • 如果希望在webpack支持babel,则需要向webpack中引入babel的loader

首先还是安装

npm add --dev babel-loader @babel/core @babel/preset-env
  • babel-loader:连接webpack和babel的中间件
  • @babel/core:babel的转换核心
  • @babel/preset-env:预设环境
{
  test: /\.js$/,
  exclude: /node_modules/,
  use: {
    loader: "babel-loader",
    options: {
      presets: ["@babel/preset-env"],
    },
  },
},

 optimization优化

压缩打包后的js代码

同样是两步,先安装

npm add --dev terser-webpack-plugin

然后引入和配置

const TerserPlugin = require("terser-webpack-plugin")
  optimization: {
    minimize: true,
    minimizer: [new TerserPlugin()],
  },

webpack-dev-serve

每次修改了代码后都得重新执行打包命令?webpack也提供了一个插件能在保存后自动打包

 安装webpack-dev-serve

npm add --dev webpack-dev-server

然后先在webpack.config.js中进行配置

  devServer: {
    static: "./dist",
  },

再在package.json中进行配置

  "scripts": {
    "start": "webpack serve --open"
  },

 这样在我们执行npm start的时候就会自动执行webpack serve

并且通过 npm start 打开的网页能在我们修改保存后自动刷新页面

output——避免浏览器缓存js文件

由于现在每次生成的文件名都是dist.js,所以浏览器会对这个文件进行缓存,进而不更新。为了避免进行缓存,可以给文件名添加一段随机的字符,每次更新后都生成新的随机字符

所以在webpack.config.js中配置输出即可

output: {
    filename: "[name].[contenthash].js",
    path: path.resolve(__dirname, "dist"),
  },

plugin插件

  • 插件用来为webpack来扩展功能
  • 插件目的在于解决 loader 无法实现的其他事。
  • Webpack 提供很多开箱即用的 插件。

html-webpack-plugin插件

 `html-webpack-plugin` 是一个 webpack 插件,用于简化在构建过程中生成 HTML 文件的工作。它可以帮助将 webpack 打包生成的 JavaScript 文件自动插入到 HTML 文件中,并可以根据配置自定义生成的 HTML 文件的内容和结构,比如添加 meta 标签、指定模板文件等。

在使用 `vue-cli-service` 创建的 Vue 项目中,通常会自动集成 `html-webpack-plugin` 插件,用于生成项目的 index.html 文件。这样可以确保在构建项目时,自动生成的 JavaScript 文件会被正确地插入到 HTML 文件中。

 插件安装

npm add html-webpack-plugin --dev

 然后导入webpack.config.js文件

const HtmlWebpackPlugin = require("html-webpack-plugin")

再进行配置即可

  plugins:[
    new HtmlWebpackPlugin()
  ],

所以这时候再执行打包命令,可以看到输出文件夹下还多了一个index.html

注意:虽然 `html-webpack-plugin` 是一个常用的 webpack 插件,但在某些情况下,开发者可能会选择手动维护 HTML 文件或者使用其他方式来处理 HTML 文件的生成和引入。可将index.html单独放,比如在 public 目录里。

 使用插件提升开发效率的插件

 loader和plugin的区别

Loader 主要用于处理模块的转换,而 Plugin 主要用于扩展 webpack 的功能和优化构建过程。Loader 是模块级别的处理工具,而 Plugin 是整个构建过程的控制器。在实际开发中,通常会同时使用 Loader 和 Plugin 来完成复杂的构建任务。

  1. Loader:

    • Loader 用于在打包过程中对模块的源代码进行转换。它可以将不同类型的文件(如 JavaScript、CSS、图片等)转换为 webpack 可以处理的模块。
    • Loader 可以理解为一个转换器,它接收源文件作为输入,经过转换处理后输出新的文件。常见的 Loader 包括 babel-loader(用于转换 ES6+ 语法)、css-loader(用于处理 CSS 文件)、file-loader(用于处理文件资源)等。
    • Loader 是链式调用的,可以通过在 webpack 配置中定义多个 Loader,并按照从右到左的顺序依次执行。
  2. Plugin:

    • Plugin 用于扩展 webpack 的功能,在打包过程中执行一些额外的任务。它可以监听 webpack 构建生命周期的事件,并在适当的时机执行自定义的逻辑。
    • Plugin 可以用于各种用途,如优化输出、资源管理、环境变量注入等。常见的 Plugin 包括 HtmlWebpackPlugin(用于生成 HTML 文件)、CleanWebpackPlugin(用于清理构建目录)、MiniCssExtractPlugin(用于提取 CSS 文件)等。
    • Plugin 是通过在 webpack 配置中实例化并添加到 plugins 数组中来使用的,每个 Plugin 都是一个独立的实例。

webpck打包/构建流程

从entry开始,递归解析entry依赖的所有module;
再根据module.rules里配置的loader进行相应的转换处理,在解析出module依赖的其他模块,解析出一个一个的chunk(module进行分组),最后所有的chunk会转换成文件输出的output;
在整个构建流程中,webpack会在恰当的时机执行plugin里 定义的那些插件。从而完成plugin插件里的任务

 webpack打包简单的总结

1.一切源代码文件,各种资源都可以通过各种loader转换为js模块,模块之间可以互相引用。

2.webpack通过entry入口点,递归的处理各模块的关系,最后输出一个到多个产物包。输出就是将多个模块组成chunck。

3.每个入口点都是一个chunk group,在不考虑分包的情况下,一个chunk group只有一个chunk。该chunk包含了递归分析后的所有模块。

 Webpack热更新

    热更新(HMR)全程Hot Module Replacement,可以理解为模块热替换,指在应用程序运行的过程中,替换、添加、删除模块,而无需重新刷新整个应用。
    例如在运行过程中修改了某个模块,通过自动刷新会导致整个应用的整体刷新,那页面中的状态信息都会丢失;如果使用的是热更新,就可以实现只将修改的模块实时替换至应用中,不必完全刷新应用。热更新的配置

const webpack = require('webpack')
module.exports = {
  // ...
  devServer: {
    // 开启 HMR 特性
    hot: true
    // hotOnly: true
  }
}

//指定模块发生更新的时候进行HRM
if(module.hot){
    module.hot.accept('./util.js',()=>{
        console.log("util.js更新了")
    })
}

启动服务后,会发现不会生成dist目录,这是因为devServer把打包后的模块不会再放到dist目录下,二是放到了内存中,从而提升速度。 

文件指纹(hash)

文件指纹 是指打包后输出的文件名和后缀

文件hash:一般是结合CDN缓存来使用,通过webpack构建之后,生成对应文件名自动带上对应的MD5值。如果文件内容改变的话,那么对应文件哈希值也会改变,对应的HTML引用的URL地址也会改变,触发CDN服务器从源服务器上拉取对应数据,进而更新本地缓存

// vue.config.js

const mode = process.env.NODE_ENV
const isDev = mode === 'development'
module.exports = {
  // ... 其他配置

  // 关键配置
  configureWebpack: {
    output: {
      filename: isDev ? `[name].js` : `[name].[chunkhash:5].js`,
      chunkFilename: isDev ? `[name].js` : `[name].[chunkhash:5].js`,
    },
  },
}

 使用哈希值的作用:

1、提升webpack打包速度和项目体积

将webpack入口的chunk文件中所有公共的代码提取出来,减少代码体积;同时提升webpack打包速度。

2、利用缓存机制

依赖的公共模块文件一般很少更改或者不会更改,这样独立模块文件提取出可以长期缓存。

3、利用浏览器缓存

方便我们在改动代码的时候,线上代码发版后及时读取最新的js文件,防止出现缓存问题;

 优化webpack打包速度

使用高版本的Webpack,使用多进程构建;压缩代码;缓存等角度出发进行优化。

如设置exclude等的配置,避免多余查找的文件,比如使用babel别忘了剔除不需要遍历的nodeModules模块。

如开启缓存,babel-loader在执行的时候,可能会产生一些运行期间重复的公共文件,造成代码体积大冗余,同时也会减慢编译效率;可以加上cacheDirectory参数或使用 transform-runtime 插件试试

// webpack.config.js
use: [{
          loader: 'babel-loader',
          options: {
          cacheDirectory: true
      }]

 source-map是什么

前端工程打包后代码会与源码产生不一致,当代码运行出错时控制台会定位出错代码的位置。SourceMap的用途是可以将转换后的代码映射回源码,如果你部署了js文件对应的map文件资源,那么在控制台里调试时可以直接定位到源码的位置

 线上环境处理方案

Sourcemap 的种类有很多, 在生产环境下可以用process.env判断一下。 webpack中可以在devtool中设置, 在开发环境中可以配置devtool为cheap-module-source-map,方便调试。生产环境下建议采用none的方式,这样做不暴露源代码。或者是nosources-source-map 的方式,既可以定位源代码位置,又不暴露源代码。

 eslint、prettier代码规范工具

eslint和prettier是前端代码规范工具,可以在代码目录中通过新增.eslintrc.js配置eslint。新增prettier.config.js配置prettier工具。

eslint和prettier只在开发时使用,用于语法检查和规范代码格式。所以只安装在devDependencies中

eslint

 JavaScript 是一个动态的弱类型语言,在开发中比较容易出错。因为没有编译程序,为了寻找 JavaScript 代码错误通常需要在执行过程中不断调试。像 ESLint 这样的可以让程序员在编码的过程中发现问题而不是在执行的过程中。

ESLint 的初衷是为了让程序员可以创建自己的检测规则。ESLint 的所有规则都被设计成可插入的。ESLint 的默认规则与其他的插件并没有什么区别,规则本身和测试可以依赖于同样的模式。为了便于人们使用,ESLint 内置了一些规则,当然,你可以在使用过程中自定义规则。

 vue中常见的eslint配置。

 

env

一个环境定义了一组预定义的全局变量。通常我们会这样配置

    env: {
    browser: true,
    es6: true,
    node: true,
    },

从env的字面意思看,是控制全局变量的,也就是你的整套代码是打算在哪里允许,会采用什么方式方法。比如我们把browser: false;你会发现在你的代码中就会提示alert不可使用,必须要在前面加上window才能管用。所以要避免类似这个情况,我们通常会用到以上的配置项。(当然可以根据情况减少规则配置,速度会快)

plugins 

Eslint本身就具备基础的lint规则校验能力,但是随着市场的进步,不断出现了很多技术栈,如react,Vue,angular,typescript等等,这个时候,ESlint基础规则就不能满足了,所以市场就出现了校验相应技术栈的插件,就比如eslint-plugin-react。

 可以省略 eslint-plugin- 前缀。如eslint-plugin-react,eslint-plugin-;

示例:指定了所使用的 ESLint 插件,包括 TypeScript 和 Vue 插件。

  plugins: ["@typescript-eslint", "vue"],

 extends

表示规则继承,属性值可以省略包名的前缀 eslint-config-。如eslint-config-ali;

  extends: [
    // "eslint:recommended",
    "plugin:vue/vue3-recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:vue/vue3-essential",
    "plugin:prettier/recommended",
  ],
  parser

指定了所使用的 ESLint 规则配置,这里使用了一系列扩展规则,包括 Vue 3 推荐规则、TypeScript 推荐规则、Prettier 推荐规则等。 

parserOptions

 指定了代码解析器的选项,包括 ECMAScript 版本、解析器、模块类型等。

  parserOptions: {
    ecmaVersion: "latest",
    parser: "@typescript-eslint/parser",
    sourceType: "module",
  },

rules

指定了具体的规则配置,用于控制代码规范和风格,比如生产环境禁止使用 console、禁止使用 debugger、禁止使用特定的语法等。使用off关闭eslint检查等

  rules: {
    "no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
    "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
    "@typescript-eslint/no-explicit-any": 0,
    "generator-star-spacing": "off",
    "no-tabs": "off",
    "no-unused-vars": "off",
    "@typescript-eslint/no-unused-vars": "off",
    "no-irregular-whitespace": "off",
    "@typescript-eslint/no-var-requires": "off",
    "vue/multi-word-component-names": "off",
    "vue/v-slot-style": "off",
    "vue/attribute-hyphenation": "off",
    "vue/v-on-event-hyphenation": "off",
    "vue/no-v-html": "off",
  },

.eslintignore忽略eslint检查

 

prettier

semi设置句末自动加分号,singleQuote允许使用单引号 endOfLine:'lf'换行符使用lf。

printWidth尝试在多少字符后换行

ESLint和Prettier有什么区别?

    功能职责不同

        ESLint主要偏向于把控项目的代码质量
        Prettier主要偏向于统一项目的代码风格

    作用不同

        ESLint 自动扫描JS文件用来查找常见的语法和样式错误
        Prettier 扫描文件 用来查找样式问题并自动重新格式化代码,以确保在缩进、间距、分号、单引号与双引号等方面遵循一致的规则

 package-lock.json作用

package-lock.json 文件是 npm 5 之后引入的一个文件,用于锁定安装时的依赖包的版本,以确保在不同的环境中安装相同的依赖包版本,从而保证项目的稳定性和一致性。

 没有package-lock的情况,不同开发者在不同时间下载的npm有差别,导致版本差异,影像项目质量

比如项目的包里使用^版本号,则表示保持大版本不变,取最新的小版本。npm在install项目时会自动更新包。如下示例显示在两个不同时期执行npm install会下载不同的依赖包

 而使用了package-lock.json严格锁定依赖包的版本,不同人在不同时期执行npm install后获取到的依赖包版本号都跟package-lock文件中记录的版本号一致。npm 不会自动更新依赖版本号。提高项目的稳定性。

package-lock.json 文件会在以下情况下被修改:

  1. 当用户第一次运行 npm install 安装依赖包时,package-lock.json 文件会被创建或更新,记录当前安装的依赖包的确切版本号。

  2. 当用户手动更新某个依赖包的版本,或者通过 npm install 安装新的依赖包时,package-lock.json 文件会相应地更新,记录新的依赖包版本信息。

  3. 当用户删除或升级 package.json 中的某个依赖包,并运行 npm install 时,package-lock.json 文件会被更新以反映这些更改。

当用户添加新的 npm 包后,package-lock.json 文件会通过以下步骤进行更新:

  1. 用户运行 npm install 安装新的 npm 包。

  2. npm 会根据 package.json 中的依赖关系和版本范围,确定要安装的具体版本。

  3. npm 会更新 package-lock.json 文件,记录新安装的依赖包的确切版本号,并更新依赖树的信息。

通过这种方式,package-lock.json 文件可以确保在不同的开发环境中安装相同的依赖包版本,避免由于依赖包版本不一致导致的问题。

 

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

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

相关文章

什么是Dapp

什么是Dapp Dapp(去中心化应用)程序的后端代码(智能合约)运行在一个去中心化的网络上,而非中心化的服务器。他们使用以太坊区块链网络作为数据存储端,并且用智能合约实现app的业务逻辑。 特点 智能合约&am…

【C语言】linux内核__netdev_start_xmit函数

一、中文注释 // 这是一个内联函数,用于启动网络设备的数据包发送流程。 // 它通过网络设备操作集(net_device_ops)指定的特定函数 // 来启动给定数据包的发送。// ops: 指向包含网络设备操作函数的结构体的指针 // skb: 指向要发送的套接字…

2024年大路灯无广测评推荐:书客、柏曼、霍尼韦尔大路灯哪个品牌更好?

临近开学,护眼大路灯哪个品牌好的话题度在不断提高! 有人说大路灯是“智商税”,但也有人说“学生党福音”、“照明神器”,吸引了大量人群的关注。在没用过大路灯之前我也很担心在担心是否是智商税的问题,直到我自己入…

AIGC实战——扩散模型(Diffusion Model)

AIGC实战——扩散模型 0. 前言1. 去噪扩散概率模型1.1 Flowers 数据集1.2 正向扩散过程1.3 重参数化技巧1.4 扩散规划1.5 逆向扩散过程 2. U-Net 去噪模型2.1 U-Net 架构2.2 正弦嵌入2.3 ResidualBlock2.4 DownBlocks 和 UpBlocks 3. 训练扩散模型4. 去噪扩散概率模型的采样5. …

伪原创一键生成软件:为你创作有价值的文章

伪原创一键生成软件是一种现代写手必备的得力助手。无论您是写作新手还是经验丰富的老手,它都能帮助您快速生成有吸引力的文章,让您在竞争激烈的市场中脱颖而出。伪原创一键生成软件是一款让写作变得轻松且高效的神奇工具。它为写手们节省了大量的时间和…

智慧公厕:让城市更智慧、更环保

在现代社会,智慧公厕作为城市管理的重要一环,是智慧城市的重要组成部分,其建设的价值十出突出,是公共厕所信息化升级改造的核心方案。如智慧公厕源头厂家广州中期科技有限公司,所自主研发的智慧公厕整体解决方案&#…

自动驾驶---行业发展及就业环境杂谈

进入21世纪以来,自动驾驶行业有着飞速的发展,自动驾驶技术(L2---L3)也逐渐落地量产到寻常百姓家。虽然最早期量产FSD的特斯拉有着深厚的技术积累,但是进入2010年以后,国内的公司也逐渐发展起来自己的自动驾…

Attention注意力机制

1. 背景 1.1. 变长序列 1.2. 序列的输出格式 每个向量对应一个标签,如词性标注整个序列输出一个标签,如情感分析(Sentiment Analysis)由模型决定输出的标签个数,这种任务称为Seq2seq任务 1.3. 序列标注 使用全连接的方式,没办法…

「连载」边缘计算(十九)02-22:边缘部分源码(源码分析篇)

(接上篇) 从启动函数Start()中可以看到,其以go routine的方式启动很多后台处理服务,具体如下。 1)初始化edged的kubeClient,具体如下所示。 // use self defined client to replace fake kube…

MySQL进阶篇2-索引的创建和使用以及SQL的性能优化

索引 mkdir mysql tar -xvf mysqlxxxxx.tar -c myql cd mysql rpm -ivh .....rpm yum install openssl-devel ​ systemctl start mysqld ​ gerp temporary password /var/log/mysqld.log ​ mysql -u root -p mysql> show variables like validate_password.% set glob…

大气颗粒物与VOCs PMF源解析

原文:大气颗粒物与VOCs PMF源解析 第一:PMF源解析技术及其输入文件 1、大气污染源解析方法有哪些? 2、这些方法各自应用的条件以及它们的优缺点? 3、大气颗粒物的基础知识及各组分的主要来源 大气颗粒物的来源: 大…

一键解锁本地大型语言模型!Ollama框架让你轻松运行Gemma

想要在本地运行大型语言模型吗? Ollama框架提供了这样的机会。 这个框架是专为在Docker容器中部署LLM而设计的,简化了部署和管理流程。 安装Ollama后,你只需执行一条命令,即可在本地运行开源大型语言模型。 它将模型权重、配置…

Spring Security源码学习

Spring Security本质是一个过滤器链 过滤器链本质是责任链设计模型 1. HttpSecurity 【第五篇】深入理解HttpSecurity的设计-腾讯云开发者社区-腾讯云 在以前spring security也是采用xml配置的方式&#xff0c;在<http>标签中配置http请求相关的配置&#xff0c;如用户…

蓝桥杯-最小砝码

知识点&#xff1a;本题主要考察任何一个物体都可以用 3进制表示。 #include <iostream> #include<cmath> using namespace std; //知识点:任何一个物体都可以用 3进制表示 int main() { int n; cin >> n; int sum 0; for (int i 0;; i)…

cmake构建在Visual stdio 2019 和Xcode的Qt的程序

概述&#xff1a;用CMake可以方便地构建Qt的应用程序&#xff0c;前提是你已经配置好用Visual Stdio 开发的Qt的环境或者Xcode的Qt开发环境。 1、编写CMakeLists.txt cmake_minimum_required(VERSION 3.6)set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STR…

电商erp系统对接API接口功能简介

对接电商ERP系统的API接口可以按照以下步骤进行&#xff1a; 1. 确认电商ERP系统的API接口文档&#xff1a;首先&#xff0c;你需要获得电商ERP系统的API文档。API文档会提供关于如何使用系统的接口以及参数等详细信息。确保你已经仔细阅读和理解了API文档。 2. 创建API密钥&…

【Flink精讲】Flink性能调优:CPU核数与并行度

常见问题 举个例子 提交任务命令&#xff1a; bin/flink run \ -t yarn-per-job \ -d \ -p 5 \ 指定并行度 -Dyarn.application.queuetest \ 指定 yarn 队列 -Djobmanager.memory.process.size2048mb \ JM2~4G 足够 -Dtaskmanager.memory.process.size4096mb \ 单个 TM2~8G 足…

选择 Python IDE(VSCode、Spyder、Visual Studio 2022和 PyCharm)

前言 当选择 Python 开发工具时&#xff0c;你需要考虑自己的需求、偏好和项目类型。下面是对VSCode、Spyder、Visual Studio 2022和 PyCharm的对比推荐总结&#xff1a; 结论 1、如果你专注于“数据科学”&#xff0c;选择SpyDer没错。 内容 Visual Studio Code (VS Code)…

常用实验室器皿耐硝酸盐酸进口PFA材质容量瓶螺纹盖密封效果好

PFA容量瓶规格参考&#xff1a;10ml、25ml、50ml、100ml、250ml、500ml、1000ml。 别名可溶性聚四氟乙烯容量瓶、特氟龙容量瓶。常用于ICP-MS、ICP-OES等痕量分析以及同位素分析等实验&#xff0c;也可在地质、电子化学品、半导体分析测试、疾控中心、制药厂、环境检测中心等机…

自定义神经网络三之梯度和损失函数激活函数

文章目录 前言梯度概述梯度下降算法梯度下降的过程 optimize优化器 梯度问题梯度消失梯度爆炸 损失函数常用的损失函数损失函数使用原则 激活函数激活函数和损失函数的区别激活函数Relu-隐藏层激活函数Sigmoid和Tanh-隐藏层Sigmoid函数Tanh&#xff08;双曲正切&#xff09; &l…