Webpack外部节点和浏览器
我有一个在浏览器和服务器上运行的同构React应用程序。 我通过两个不同的入口点和不同的configuration运行两个单独的Webpack构build,为两者构build相同的代码。
问题是,在服务器的节点上运行时,通过外部脚本标记(本例中为Google Maps)存在于浏览器窗口上的外部文件显然不存在。 除入口点文件外,代码是相同的。
index.html的:
// index.html <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=XXX"></script>
简化configuration:
// Server Webpack config { entry: 'server.js', target: 'node', externals: { google: google } } // Client Webpack config { entry: 'client.js', target: 'browser', externals: { google: google } }
组件:
// The view which builds and runs fine in // the client but doesn't run on the server. var React = require('react'), css = require('./style.css'), google = require('google'); // Nope, not on the server obviously! var Component = React.createClass({ render: function () { return ( <div> // Do maps stuff </div> ); } }); module.exports = Component;
我的问题是我应该如何处理这个?
Error: Cannot find module 'google'
我目前有一个我一点都不喜欢的解决scheme。
// Server Webpack config { entry: 'server.js', target: 'node', externals: { google: google }, plugins: [ new webpack.DefinePlugin({ 'ENV.browser': false }), ] } // Client Webpack config { entry: 'client.js', target: 'browser', externals: { google: google }, plugins: [ new webpack.DefinePlugin({ 'ENV.browser': true }), ] } // The component var React = require('react'), css = require('./style.css'); if (ENV.browser) { var google = require('google'); } var Component = React.createClass({ render: function () { return ( <div> if (ENV.browser) { // Do maps stuff } </div> ); } }); module.exports = Component;
您可以使用NormalModuleReplacementPlugin
将模块replace为noop,按照Dustan Kasten的想法:
{ plugins: [ new webpack.NormalModuleReplacementPlugin(/^google$/, 'node-noop'), ], }
- 在iis上运行反应同构
- 使用Webpack中为客户端定义的别名反应呈现,但有问题
- 包含package.json文件失败时使用webpack
- Webpack-dev-server和isomorphic react-node应用程序
- 使用webpack,我可以将Node.js和浏览器代码放在同一个文件中,但阻止Node.js代码将其传送到浏览器?
- 从React(同构应用程序)进行API调用时出现“Access-Control-Allow-Origin”问题
- 如何利用节点后端的浏览器库
- 我应该使用快递,客户端反应路由器还是服务器端反应路由器?
- 在React.js,node.js,webpack,babel,express中使用fs模块