Javascript 使用Webpack外部并仍然允许ES6样式的导入?
我正在创建一个Chrome扩展,我正在使用React和Webpack 因为这是一个Chrome扩展,所以我可以使用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
manifest.json
在我自己的代码执行之前将React和ReactDOM加载到浏览器中。我的理解是:
加载的react.js库显示为全局变量,可通过window.react访问manifest.json
- 可以配置Web包外部,使React和ReactDOM不会捆绑在一起
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')
,但仍然收到相同的错误。