webpack中mode、NODE_ENV、DefinePlugin、cross-env的使用

这篇具有很好参考价值的文章主要介绍了webpack中mode、NODE_ENV、DefinePlugin、cross-env的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

webpack中mode、NODE_ENV、DefinePlugin、cross-env的使用,webpack,cross-env,NODE_ENV,mode,DefinePlugin

本文讲的全部知识点,都是和webpack相关的。如果你之前有疑问,那本文一定能帮你搞清楚。

问题来源一般是类似下面代码(webpack.json中):

"scripts": {
    "dev": "cross-env NODE_ENV=development webpack-dev-server --config ./config/webpack.config.dev.js"
  },

代码中出现的:cross-envNODE_ENV。还有webpack.config.js中设置的modeDefinePlugin

环境版本(如果是低版本下面也会提及):

  • webpack < v4
  • webpack-dev-server < v4
  • cross-env < v5

编译环境和运行环境

在讲下面之前,我们必须清楚什么是编译环境,什么是运行环境?

  • 编译环境(node环境)

我们在终端执行:npm run devnpm run start 或打包 npm run build 都是在编译环境,也就是node环境。所以webpack的配置文件 webpack.config.jswebpack.dev.jswebpack.production.js 是运行在编译环境中的。

  • 运行环境(浏览器环境)

我们写的业务代码等都是在浏览器中运行的,也就是打包之后我们的代码还在的。

只有区分这两个环境,才能理解下面不同配置方式,有时能读取到,有时读取不到的原因.

概念

mode

模式, webpack会根据mode的值做一些内置优化。

枚举值:none, developmentproduction(默认)。 只能是这三个值中某一个。

配置方式:

  • 方式一(推荐)

在webpack配置文件(webpack.config.js、webpack.develop.js、webpack.production.js)中设置:

module.exports = {
  mode: 'development'
};
  • 方式二

package.json中,webpack的CLI命令参数:

webpack serve --mode=development

这两种方式设置的mode值,只能在业务代码(运行环境)中通过process.env.NODE_ENV读取到;在编译环境,webpack配置文件中是读取不到的。

注意:

webpack 4+ 中,你不需要做任何设置(其实是webpack自动帮你把变量加到了DefinePlugin中)就可以在代码中读取process.env.NODE_ENV的值了。

但是在 webpack 3 及其更低版本中,你需要在webpack配置文件中使用 DefinePlugin设置成全局变量,才可以访问得到:

var webpack = require('webpack')

module.exports = {
  // ...
  plugins: [
    // ...
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify('production')
    })
  ]
}

NODE_ENV

上面我们设置mode,是在运行环境中使用;如果想在编译环境(webpack配置文件中使用)就需要用到NODE_ENV了。

本质就是给当前Node进程,设置一个环境变量。只有在当前Node进程中有效。

设置方式:

package.json中:

{
  "scripts": {
    "dev": "NODE_ENV=development webpack-dev-server --config webpack.dev.config.js"
  }
}

你如果是mac电脑执行npm run dev是能正常运行的,但如果你是windows电脑,会报错:

'NODE_ENV' 不是内部或外部命令,也不是可运行的程序或批处理文件。

是的,在windows里面需要修改命令为:

{
  "scripts": {
    "dev": "set NODE_ENV=development && webpack-dev-server --config ./config/webpack.config.dev.js"
  }
}

要解决跨环境问题,就要用到下面的cross-env了,我们一会在讲,还是先回来。

设置了NODE_ENV=development后,在哪使用,如何使用呢?

答案:只能在编译环境(webpack的配置文件webpack.config.js等)中使用。可以通过**process.env.NODE_ENV读取。**在业务代码中是无法读取的。

cross-env

为解决跨环境问题。

安装:

npm install cross-env@5

修改package.json中命令:

{
  "scripts": {
    "dev": "cross-env NODE_ENV=development webpack-dev-server --config webpack.dev.config.js"
  }
}

这样在macwindows中就都可以执行npm run dev了。

DefinePlugin

上面在讲mode时已经提到了DefinePlugin ,它主要用来定义一些全局变量,并会在 编译时 将你代码中的全局变量替换为具体值。这在需要根据开发模式与生产模式进行不同的操作时,非常有用。

new webpack.DefinePlugin({
  // 定义...
});
使用

传递给 DefinePlugin 的每个键都是一个标识符或多个以 . 连接的标识符。

  • 如果该值为字符串,它将被作为代码片段来使用。
  • 如果该值不是字符串,则将被转换成字符串(包括函数方法)。
  • 如果值是一个对象,则它所有的键将使用相同方法定义。
  • 如果键添加 typeof 作为前缀,它会被定义为 typeof 调用。

这些值将内联到代码中,从而允许通过代码压缩来删除冗余的条件判断。

new webpack.DefinePlugin({
  PRODUCTION: JSON.stringify(true),
  'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
});

提示:

请注意,由于本插件会直接替换文本,因此提供的值必须在字符串本身中再包含一个 实际的引号 。通常,可以使用类似 '"production"' 这样的替换引号,或者直接用 JSON.stringify('production')

if (!PRODUCTION) {
  console.log('Debug info');
}

if (PRODUCTION) {
  console.log('Production log');
}

未经 webpack 压缩过的代码:

if (!true) {
  console.log('Debug info');
}
if (true) {
  console.log('Production log');
}

经过压缩后:

console.log('Production log');

cross-env + DefinePlugin

确切的讲,使用cross-env可以定义任意Node全局环境变量,例如package.json中:

{
  "scripts": {
    "dev": "cross-env NODE_ENV=development PUBLIC_PATH=/ui webpack-dev-server --config webpack.dev.config.js"
  }
}

我们这里又新增了一个全局变量PUBLIC_PATH,用来设置URL基础路径。

在编译环境(webpack.config.js)中,可以直接使用process.env.PUBLIC_PATH获取。

并可以通过添加到DefinePlugin,在代码中使用

new webpack.DefinePlugin({
  PUBLIC_PATH: JSON.stringify(process.env.PUBLIC_PATH),
});

定义之后就可以在代码中使用了:文章来源地址https://www.toymoban.com/news/detail-860100.html

const url = PUBLIC_PATH + '/views'
console.log(url); // =>'/ui/views'

总结

  1. mode是设置执行模式,webpack4会自动将mode的值通过DefinePlugin设置为全局变量,业务代码中可以使用process.env.NODE_ENV读取值。
  2. NODE_ENV是设置Node环境变量,在webpack.config.js、webpack.dev.js等文件中通过process.env.NODE_ENV读取值。
  3. cross-env是用来解决跨环境的。
  4. DefinePlugin用来设置全局变量,在业务代码中通过process.env.xxx读取值。

到了这里,关于webpack中mode、NODE_ENV、DefinePlugin、cross-env的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • nodejs:非docker下设置NODE_ENV

    参考:         使用process.env.NODE_ENV的正确姿势 - 掘金

    2024年02月13日
    浏览(57)
  • vite4生产环境打包报错NODE_ENV=production is not supported in the .env file.

    vue3+vite4生产环境production打包报错: 大致意思就是: NODE_ENV=.ENV文件中不支持生产。仅支持NODE_ENV=开发来创建项目的开发构建。如果需要设置process.env.NODE_env,则可以在Vite配置中进行设置。 ** ** 如果有警告 那就把vite.config.js里面的minify换成:terser(别忘记install下载了)

    2024年02月11日
    浏览(75)
  • Webpack5 DefinePlugin的作用

    在Webpack 5中,DefinePlugin是一个插件,用于创建全局常量,这些常量可以在编译过程中被引用。它的作用是允许开发人员在代码中定义全局变量,这些变量在构建过程中将被替换为其对应的值。 DefinePlugin并不是必须的,但它是一个非常有用的插件,在某些情况下可以帮助我们优

    2024年02月16日
    浏览(36)
  • 在vite或者vue-cli中使用.env[mode]环境变量

    在项目中总会遇到一些默认的配置,需要我们配置到静态文件中方便我们去获取,这时候就可以用到这个.env环境变量文件,在cli创建的项目中顶层的nodejs会有一个process对象,这个对象可以根据不同的环境获取不同的环境配置文件,但是vite中获取变量的方式不一样。 创建变量文件

    2024年02月06日
    浏览(117)
  • webpack 5 mode的作用和区别

    通过选择  development ,  production  或  none  之中的一个,来设置  mode  参数,你可以启用 webpack 内置在相应环境下的优化。其默认值为  production 。 会将  DefinePlugin  中  process.env.NODE_ENV  的值设置为  developmen或者production . 为模块和 chunk 启用有效的名。 例如js文件里面打印

    2024年02月03日
    浏览(34)
  • /usr/bin/env: node: 没有那个文件或目录

    在安装Elasticsearch-head插件的时候,我们需要先安装node。 1、node在安装好之后,使用以下命令建立了【软连接】: 2、然后安装好Elasticsearch-head之后,启动Elasticsearch-head的时候报错: 【软连接】应该到 /usr/bin 目录下建立,而不是随随便便找个目录进行建立的。 1、删除/opt/es/下

    2024年02月15日
    浏览(41)
  • 《基于 Vue 组件库 的 Webpack5 配置》1.模式 Mode 和 vue-loader

    一定要配置 模式 Mode,这里有个小知识点,环境变量 process.env.NODE_ENV 一定要配置 vue-loader Vue Loader v15 现在需要配合一个 webpack 插件才能正确使用; 一个 webpack 的 loader,它允许你以一种名为单文件组件 (SFCs)的格式撰写 Vue 组件; vue-loader 和 vue-template-compiler 要一起安装,以保

    2024年02月11日
    浏览(42)
  • webpack.config.js配置文件报错:The ‘mode‘ option has not been set

    报错 WARNING in configuration The \\\'mode\\\' option has not been set, webpack will fallback to \\\'production\\\' for this value. Set \\\'mode\\\' option to \\\'development\\\' or \\\'production\\\' to enable defaults for each environment. You can also set it to \\\'none\\\' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/ 解决: 在package.json文件

    2024年01月20日
    浏览(56)
  • Jenkins 安装 NodeJS 插件后无法识别Node环境:env node No such file or directory

    经验证,该问题在使用Jenkins官方文档中推荐的docker镜像 jenkinsci/blueocean 才会出现。 改用最新的Jenkins docker镜像就不会遇到: 我安装的是最新的Jenkins docker镜像: 然后运行镜像: 注意 docker run 时,镜像名为 jenkins/jenkins:lts ,而不是 jenkins/jenkins 。两者不同。 为什么 jenkinsci/blu

    2024年02月07日
    浏览(47)
  • #! /usr/bin/env node 命令与 npm link 建立项目间软连接

    #! /usr/bin/env node js 代码… 这条指令通常出现在Node.js脚本文件的开头,它的作用是用来指定该脚本文件使用 /usr/bin/env 来寻找并执行 node 解释器。这里的 node 即Node.js的执行环境。 #!/usr/bin/env node 是Unix/Linux系统(包括Mac OS X)下的一个Shebang(#!)语法,用于指明脚本的解释器。

    2024年04月22日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包