Webpack条件要求

var*_*ump 13 javascript leveldb webpack isomorphic-javascript

我正在用webpack编写一个同构的Key Value Store.

这是我目前加载库的方法,这显然不起作用,因为webpack想解决这两个问题require.什么是正确的方法?

var db = null;

if (typeof window === 'undefined') {
    // node context
    db = require('level');
} else {
    // browser context
    db = require('gazel');
}
Run Code Online (Sandbox Code Playgroud)

我知道,你可以为webpack 提供一个目标.但我不知道如何使用它.

谢谢!

Juh*_*nen 14

我认为resolve.alias会对你有用.您可以将db模块设置为指向levelgazel取决于您正在创建的构建.


Lon*_*tum 10

webpack.config.js

module.exports = {
plugins: [
    new webpack.DefinePlugin({
        "process.env": {
            BROWSER: JSON.stringify(true)
        }
    })
]}
Run Code Online (Sandbox Code Playgroud)

您-universal.js

var db = null;
if (!process.env.BROWSER) {
    // node context
    db = require('level');
} else {
    // browser context
    db = require('gazel');
}
Run Code Online (Sandbox Code Playgroud)

  • 只是一个小问题,但为什么这么多人有这个JSON.stringify(true)废话?这实际上(字面上)相当于"真实"...... (3认同)
  • @JasonBoyd 我想知道我自己,我认为它开始是一种让人们注意的方式,因为对于字符串值,人们很容易误解`'process.env.NODE_ENV':'"production"'` 中需要额外的引号. 他们可能会错误地删除它们,尤其是在“true”的情况下。 (3认同)
  • 这不应该是 `if(process.env.BROWSER === 'true') {}` 吗? (3认同)
  • 多余的引号是必需的,因为值字符串将直接插入到源代码中以代替引用。将DefinePlugin配置为替换`'process.env.NODE_ENV':'“ production”'`之后,代码`if(process.env.NODE_ENV ==“ production”){...}`变成`if(“ production” ==“ production”){...}`。如果没有多余的引号,它将变成`if(production ==“ production”){...}`,它使用未声明的变量。 (2认同)