You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// 报错信息
Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema.
- configuration has an unknown property 'mode'. These properties are valid:
...
import { cube } from './math.js';
if (process.env.NODE_ENV !== 'production') {
console.log('Looks like we are in development mode!');
}
function component() {
var element = document.createElement('pre');
element.innerHTML = [
'Hello webpack!',
'5 cubed is equal to ' + cube(5)
].join('\n\n');
return element;
}
document.body.appendChild(component());
多用户配置
在开发中,如果项目代码中,面对多个客户,现在需要根据不同客户打包的不同的代码,需要怎么配置呢?
平常的开发中一些需求也是比较类似的,例如下面这段代码,根据不同环境,配置不同的接口地址。它们都是需要根据环境变量来做不同的配置,从而实现打包的时候进行区分。
webpack的模式
开发环境(development)和生产环境(production)的构建目标差异很大。在开发环境中,我们需要具有强大的、具有实时重新加载(live reloading)或热模块替换(hot module replacement)能力的 source map 和 localhost server。而在生产环境中,我们的目标则转向于关注更小的 bundle,更轻量的 source map,以及更优化的资源,以改善加载时间。由于要遵循逻辑分离,通常为每个环境编写彼此独立的 webpack 配置。
虽然,以上我们将生产环境和开发环境做了略微区分,但是,请注意,我们还是会遵循不重复原则(Don't repeat yourself - DRY),保留一个“通用”配置。为了将这些配置合并在一起,我们将使用一个名为 webpack-merge 的工具。通过“通用”配置,我们不必在环境特定(environment-specific)的配置中重复代码。
webpack4配置mode
提供 mode 配置选项,告知 webpack 使用相应模式的内置优化,
mode
的默认值是production
。mode
选项:可以看到
mode
实际就是设置process.env.NODE_ENV
的值。在
webpack 3.12.0
,以上的配置方法都是不适用的。使用第二种方式,同样没有成功
在webpack3的配置
许多 library 将通过与 process.env.NODE_ENV 环境变量关联,以决定 library 中应该引用哪些内容。例如,当不处于生产环境中时,某些 library 为了使调试变得容易,可能会添加额外的日志记录(log)和测试(test)。其实,当使用 process.env.NODE_ENV === 'production' 时,一些 library 可能针对具体用户的环境进行代码优化,从而删除或添加一些重要代码。
webpack3
需要使用 webpack 内置的 DefinePlugin 为所有依赖定义这个变量:webpack.dev.conf.js
如果您正在使用像 react 这样的 library,那么在添加此 DefinePlugin 插件后,你应该看到 bundle 大小显著下降。还要注意,任何位于 /src 的本地代码都可以关联到 process.env.NODE_ENV 环境变量,所以以下检查也是有效的:
也就是说,在 webpack.config.js 里面我们是无法拿到 process.env.NODE_ENV 的。但是可以换种方式来设置配置信息,可以参考 issue 里这个解决方法
DefinePlugin
DefinePlugin 允许创建一个在编译时可以配置的全局常量。这可能会对开发模式和发布模式的构建允许不同的行为非常有用。如果在开发构建中,而不在发布构建中执行日志记录,则可以使用全局常量来决定是否记录日志。这就是 DefinePlugin 的用处,设置它,就可以忘记开发和发布构建的规则。
用法
每个传进 DefinePlugin 的键值都是一个标志符或者多个用 . 连接起来的标志符。
这些值会被内联进那些允许传一个代码压缩参数的代码中,从而减少冗余的条件判断。
process.env
process 对象是一个 global (全局变量),提供有关信息,控制当前 Node.js 进程。作为一个对象,它对于 Node.js 应用程序始终是可用的,故无需使用 require()。
返回用户的环境信息,返回的对象类似如下:
设置NODE_ENV这样的环境变量
src/下都可以获取到,但是webpack.config.js获取不到
build.js
配置
实现步骤
npm run dev
或者npm run build
之前,根据不同客户生成对应的路由文件标识客户
这样这个 CLIENT 只能在 src/ 下面的文件获取到,无法在构建的时候进行判断。同时不方便扩展,当多个用户的时候就需要多个配置文件。
如果上面第二种方法不是直接写死,而是在执行命令的时候直接输入客户,然后代码里面直接判断即可,这样就解决第一步的问题。这就需要cross-env。
cross-env
cross-env(跨Win/Linux平台设置 process.env值)
安装
在 package.json 文件中设置不同的运行脚本,比如:
在vue项目中的使用
在使用Vue Cli构建的项目中,需要在 process.env 设置其他变量名进行使用,如:BUILD_ENV 在 package.json 的 script 字段中作如下配置:
由于搭配webpack重新设置了 process.env 的值,需要在webpack.dev.conf.js 及 webpack.prod.conf.js 文件中
即在该插件设置并暴露出 process.env 对象后,再增加process.env.BUILD_ENV 字段并进行赋值。
此时,可在前端JS文件中通过
process.env.BUILD_ENV
获得 package.json 命令中设置的值,进行其他操作,比如,引入不同环境的配置文件:
在config文件夹中增加 buildConfig 文件夹,其中新建以下3个文件:
在每个文件中采用module.exports的方式导出变量,如:
在其他文件中使用
是的!!!这样就可以根据客户名称然后获取客户对应的配置!!!
使用
参考
The text was updated successfully, but these errors were encountered: