编辑 2019-09-02
要使用 .env 文件中的环境变量,我建议使用dotenv,因为它非常简单。这是一个示例,它在 .env 文件中创建所有变量的对象,并通过 DefinePlugin 使它们在客户端(即在 React 中)可访问。
// gatsby-node.js
var dotenv = require('dotenv');
const env = dotenv.config().parsed;
// Create an object of all the variables in .env file
const envKeys = Object.keys(env).reduce((prev, next) => {
prev[`process.env.${next}`] = JSON.stringify(env[next]);
return prev;
}, {});
exports.onCreateWebpackConfig = ({ stage, rules, loaders, plugins, actions }) => {
actions.setWebpackConfig({
plugins: [
// Add the environment variables to webpack.DefinePlugin with define().
plugins.define(envKeys)
]
});
};
这是我如何从服务工作者获取应用程序名称和版本package.json
并在服务工作者中使用它的示例,不过我使用的是 Gatsby V2。在服务工作者中拥有版本使缓存更容易处理。正如您所写,DefinePlugin 是要走的路,但是当我们在 Gatsby 中使用它时,它有点不同。
我们需要导入package.json
文件并添加我们的自定义 webpack 配置gatsby-node.js
,plugins.define()
我们告诉 webpack 使用 DefinePlugin:
const packageJson = require('./package');
exports.onCreateWebpackConfig = ({
plugins,
actions,
}) => {
actions.setWebpackConfig({
plugins: [
plugins.define({
__NAME__: JSON.stringify(packageJson.name),
__VERSION__: JSON.stringify(packageJson.version),
}),
],
})
}
__NAME__
这两个定义的变量__VERSION__
现在可以在我的服务工作者中访问sw.js
:
self.addEventListener('install', function (e) {
// eslint-disable-next-line
console.log(__NAME__, __VERSION__);
e.waitUntil(
caches.open(__NAME__ + __VERSION__).then(function(cache) {
return cache.addAll(filesToCache);
})
);
});
盖茨比参考:https ://www.gatsbyjs.org/docs/add-custom-webpack-config/