Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Webpack外部并仍然允许ES6样式的导入?_Javascript_Reactjs_Google Chrome Extension_Webpack - Fatal编程技术网

Javascript 使用Webpack外部并仍然允许ES6样式的导入?

Javascript 使用Webpack外部并仍然允许ES6样式的导入?,javascript,reactjs,google-chrome-extension,webpack,Javascript,Reactjs,Google Chrome Extension,Webpack,我正在创建一个Chrome扩展,我正在使用React和Webpack 因为这是一个Chrome扩展,所以我可以使用manifest.json在我自己的代码执行之前将React和ReactDOM加载到浏览器中。我的理解是: manifest.json加载的react.js库显示为全局变量,可通过window.react访问 可以配置Web包外部,使React和ReactDOM不会捆绑在一起 这是我的档案: webpack.config.js module.exports = { entr

我正在创建一个Chrome扩展,我正在使用React和Webpack

因为这是一个Chrome扩展,所以我可以使用
manifest.json
在我自己的代码执行之前将React和ReactDOM加载到浏览器中。我的理解是:

  • manifest.json
    加载的react.js库显示为全局变量,可通过window.react访问
  • 可以配置Web包外部,使React和ReactDOM不会捆绑在一起
这是我的档案:

webpack.config.js

module.exports = {

  entry: './index.js',
  output: {
    filename: 'skinny-bundle.js'
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: "babel-loader"
      }
    ]
  },

  externals: {
    react: {
      root: 'React',
      commonjs2: 'react',
      commonjs: 'react',
      amd: 'react'
    },
    'react-dom': {
      root: 'reactDOM'
    }
  }
}
import HelloGreeting from './HelloGreeting'    

ReactDOM.render(
    <HelloGreeting />,
    document.getElementById('cst')
)
// import React from 'react'   <----- here is my problem!!!

// functional component test
const Hello = props => {
  return (
    <div>hello world</div>
  )
}

// class component test
class HelloGreeting extends React.Component {
  constructor(props) {
    super(props)
  }

  render() {
    return (
      <ul>
        <li><Hello /></li>
        <li>hello universe</li>
      </ul>
    )
  }
}

export default HelloGreeting
manifest.json

{
  "manifest_version": 2,
  "name": "Test Application",
  "version": "3.2",
  "description": "testing",
  "short_name": "some test",

  "author": "blah blah",

  "content_scripts": [
     {
       "matches": ["https://www.google.com/*"],
       "js": [
         "react.js",
         "react-dom.js",

         "skinny-bundle.js"
       ],
       "run_at": "document_idle"
     }
   ]
}
index.js

module.exports = {

  entry: './index.js',
  output: {
    filename: 'skinny-bundle.js'
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: "babel-loader"
      }
    ]
  },

  externals: {
    react: {
      root: 'React',
      commonjs2: 'react',
      commonjs: 'react',
      amd: 'react'
    },
    'react-dom': {
      root: 'reactDOM'
    }
  }
}
import HelloGreeting from './HelloGreeting'    

ReactDOM.render(
    <HelloGreeting />,
    document.getElementById('cst')
)
// import React from 'react'   <----- here is my problem!!!

// functional component test
const Hello = props => {
  return (
    <div>hello world</div>
  )
}

// class component test
class HelloGreeting extends React.Component {
  constructor(props) {
    super(props)
  }

  render() {
    return (
      <ul>
        <li><Hello /></li>
        <li>hello universe</li>
      </ul>
    )
  }
}

export default HelloGreeting
如果我保持导入,我的网页包将发出一个更大的包:

Hash: 26f1526e2554c828c050
Version: webpack 3.5.5
Time: 80ms
           Asset     Size  Chunks             Chunk Names
skinny-bundle.js  5.75 kB       0  [emitted]  main
   [1] ./HelloGreeting.js 2.5 kB {0} [built]
    + 1 hidden module
Hash: 1fc9353f1fe6dd935744
Version: webpack 3.5.5
Time: 77ms
           Asset     Size  Chunks             Chunk Names
skinny-bundle.js  6.05 kB       0  [emitted]  main
   [1] ./HelloGreeting.js 2.71 kB {0} [built]
    + 2 hidden modules
我的问题是,如何配置webpack,使我仍然拥有ES6风格的导入和webpack NOT bundle react.js?


我真的想保留import语句,因为这些组件将在未来的项目中使用,我想使其尽可能模块化和可移植。

事实证明,我过于复杂化了webpack
externals

更改自:

externals: {
    react: {
      root: 'React',
      commonjs2: 'react',
      commonjs: 'react',
      amd: 'react'
    },
    'react-dom': {
      root: 'reactDOM'
    }
  }
致:

…解决了我的问题。现在webpack忽略了我所有的React代码,并使我的包变小


帮助我。

我还没有使用模块,所以我的评论可能与此无关,但是如果您希望
import
由浏览器处理,那么它是,而且您在内容脚本中使用相对路径,而不是在iframe中,对吗?如果是这样,当前URL就是该网页的URL。我尝试将代码从
import-React从'React'
更改为
const-React=require('React')
,但仍然收到相同的错误。