- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 webpack 插件的定义中,我试图提供一个覆盖函数,如果该方法存在,我的模块将获取该函数。
export const listFetchAPI = () => {
return ( LIST_FETCH_API ? LIST_FETCH_API : '/list/');
};
export const listFetchTX = (data) => {
return ( LIST_FETCH_TX === 'function' ? LIST_FETCH_TX(data) : data );
};
在我的 webpack 配置中,基于项目的环境或实现,我可能想要也可能不想为这些功能提供覆盖。
webpackConfig.plugins.push(
new webpack.DefinePlugin({
LIST_FETCH_API: JSON.stringify('https://testapi.com/listFetch/')
LIST_FETCH_TX(data) { return { ...data, test: 'HELLO!' }; }
})
);
我尝试过使用 ES5 和 ES6 表示法。构建时,出现错误 SyntaxError: Unexpected identifier
我没有在文档中看到可以通过 DefinePlugin 传递方法的地方。 https://webpack.js.org/plugins/define-plugin/
Google 搜索结果无效。我的下一步是传递一个字符串值,然后使用 react-json-schema
来获取组件。这似乎太复杂了,所以我希望有一种方法可以在 DefinePlugin
中定义方法。
编辑为了澄清起见,我正在做的是构建一个可以注册到私有(private) npm 注册表的通用 redux 模块。调用时,可以为该模块提供 API URL 和响应转换器的覆盖。这可以防止我每次为不同的 vendor 进行安装时分支代码或创建 99% 相似的模块。
如果通过环境变量提供函数不合适,那么允许此类覆盖的替代方法是什么?我不确定在通过商店发送东西时配置对象是否会发挥作用。我正在尝试的另一个选项是覆盖模块中的整个文件。我熟悉 Ruby 中使用 import_path 的方法,但在研究中,我还没有看到任何等效的 JS/npm 方法。
最佳答案
DefinePlugin
是直接文本替换,类似于 C 中的宏。Webpack 将查找标识符并将其替换为给定的字符串。以下示例说明了其工作原理。
使用以下插件配置
new webpack.DefinePlugin({
VAR: 'myVar',
STRING: '"a string (note the quotes inside quotes)"',
FUNCTION: 'function myFun(arg) { console.log("myFun was called with", arg); }'
})
和 JavaScript 作为输入:
const myVar = 'hello';
console.log(VAR);
console.log(STRING);
console.log(FUNCTION);
// IIFE requires parens to execute
(FUNCTION)('iife');
// Better, only defines the function once
const functionToCall = FUNCTION;
functionToCall('another arg');
输出的 JavaScript 将是:
const myVar = 'hello';
console.log(myVar);
console.log("a string (note the quotes inside quotes)");
console.log(function myFun(arg) { console.log("myFun was called with", arg); });
// IIFE requires parens to execute
(function myFun(arg) { console.log("myFun was called with", arg); })('iife');
// Better, only defines the function once
const functionToCall = function myFun(arg) { console.log("myFun was called with", arg); };
functionToCall('another arg');
如您所见,它们只是被 DefinePlugin
中定义的值替换了。如果您运行它,您将获得以下控制台日志:
hello
a string (note the quotes inside quotes)
[Function: myFun]
myFun was called with iife
myFun was called with another arg
对于 STRING
,您通常会使用 JSON.stringify()
,它只为您提供字符串的字符串表示形式(引号内引号)。如果你不这样做,它将只是一个标识符,如果没有定义标识符,它将抛出一个错误。 FUNCTION
还表明它将在任何地方被替换,它没有引用相同的函数,因为它是直接文本替换。
如果你想有选择地定义一些东西,你还需要检查变量是否存在,因为如果你不存在,它会抛出一个错误。
const varOrDefault = typeof VAR !== 'undefined' ? VAR : 'default';
你不能做 VAR === undefined
因为它假设变量存在并且只会检查它是否未定义,但是当它根本没有定义时,它会抛出一个错误 VAR
未定义。之后,您可以随意使用该变量并根据需要使用它,并检查它是否是一个函数(当检查一个函数时,您可以跳过它是否已被定义的测试,因为那将使用 typeof
无论如何)。
老实说,这不是一个很好的解决方案,特别是因为需要 typeof
检查,一个函数将被包含两次。公平地说,这种文本替换不适用于任何有条件定义的动态结构。将其移至配置对象会是一个更好的主意。接受配置对象并提供默认值非常简单。有几种方法可以实现这一点。
例如 Object.assign
:
function mainFunction(options) {
const defaults = { /* default values */ };
options = Object.assign({}, defaults, options);
// Use the options later
}
关于webpack - DefinePlugin 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43502886/
我尝试使用 Webpack 为我的 Vue 项目设置环境变量,但是 DefinePlugin 不起作用,它一直给我 TypeError: Cannot read property 'compilati
在 webpack 插件的定义中,我试图提供一个覆盖函数,如果该方法存在,我的模块将获取该函数。 export const listFetchAPI = () => { return ( LIST
在 webpack 插件的定义中,我试图提供一个覆盖函数,如果该方法存在,我的模块将获取该函数。 export const listFetchAPI = () => { return ( LIST
我什至很难得到 webpack 的一个 token 示例 DefinePlugin在职的。即,npx webpack运行得很好,但输出 js 文件没有替换定义的标记。这是我的最小(非)工作示例: co
我们使用 Webpack DefinePlugin 为不同的渲染模式生成输出包。因此,例如,我们的 webpack 配置将返回 [{ entry: { mode1: "./in
我以这种方式配置了三个项目: 主应用 模块A 模块 B 在我的主应用程序上,我使用 DefinePlugin 向我的依赖模块传递一个 API URL,如下所示: //webpack-1 loaders
我正在尝试使用 Webpack 构建一个 Web 应用程序,但我在设计的特定部分遇到了一些困难 - 希望这里的人有做类似事情的经验(或者足够了解来告诉我我做的完全错了)! 基本上,我们有一个 Angu
我想定义一些从异步资源返回的常量。在 Webpack 中有没有办法做到这一点? /* webpack.config.js */ module.exports = { ..., plug
您好我正在尝试使用定义插件,这样我就可以更新版本号以确保我的 JS 在发布新版本后刷新。不过,我似乎无法让 DefinePlugin 正常工作。我在文件夹 webpack 中看到它,我正在尝试遵循文档
webpack.config.js const path = require('path') HtmlWebpackPlugin = require('html-webpack-plugin') mo
当 webpack 打包并启动网站时,出现以下错误: *** process.env.ENV is not defined, assuming 'prod' env 但是,如果我记录我的 proces
我目前已将 webpack 设置为使用 babel-loader 将单个入口点编译为单个输出包。有点像 entry.js import { A } from "a.js" import { B } f
我正在尝试向我的 webpack.config.js 文件中添加一个插件,但是当我这样做时,我收到了这个错误。 [webpack-cli] Failed to load '/Users/sla
有没有办法有效注入(inject)DefinePlugin每个 block /条目不同的常量? 似乎没有办法指定 chunks在DefinePlugin 上,例如HtmlWebpackPlugin .
我正在使用 webpack.DefinePlugin注入(inject)全局常量作为我的构建管道的一部分。然而 jshint 提示常量“未定义”。 从我的 webpack.config.js 中:
我尝试从 angular.io 网站上的教程运行 Angular2 应用程序 Angular2 with Webpack Tutorial on angular.io 安装运行良好(有一些小问题,它是
我在通过Webpack的definePlugin将node_env var注入(inject)我的代码时遇到了真正的问题,并且在阅读了大量帖子后似乎没有任何效果。我有一种感觉,我错过了一些东西....
Webpack 的 DefinePlugin 没有通过环境变量。我正在使用 Webpack v2.2.1 我的 Webpack plugins block 如下: plugins: [ new w
我是 React 新手,来自 Angular。我正在为将向外部端点发送请求的代码编写一些测试。显然,我不想在生产代码中硬编码一个真实的主机,所以我想我可以使用 webpack 的 DefinePlug
我有一个要求,我们需要根据它是在生产环境还是在开发环境中执行来设置 dll 路径。因此,我决定将该值放入环境变量中,并尝试使用 webpack.DefinePlugin({}) 来实现。 方法一: w
我是一名优秀的程序员,十分优秀!