我有一个Vue应用,其结构如下(由vue init webpack myProject
自动创建:
index.html
components/
-main.js
-App.vue
我希望能够包含npm软件包。例如,https://github.com/ACollectionOfAtoms/atomic-bohr-model。按照说明,我运行了
npm install atomic-bohr-model --save
并包含了<script type="text/javascript" src="./node_modules/atomic-bohr-model/dist/atomicBohrModel.min.js" charset="utf-8"></script>
在我的index.html文件中。要使用该软件包,根据github页面,我需要运行一些javascript,
var atomicConfig = {
containerId: "#bohr-model-container",
numElectrons: 88,
idNumber: 1
}
var myAtom = new Atom(atomicConfig)
与相应的元素一起运行:
<div id="bohr-model-container"></div>
。因此,我在渲染到App.vue的一个组件中进行了以下操作:<template>
<div id="bohr-model-container" style="width: 200px; height: 200px"></div>
</template>
<script>
var atomicConfig = {
containerId: '#bohr-model-container',
numElectrons: 88,
idNumber: 1,
};
var myAtom = new Atom(atomicConfig);
export default {
name: 'myComponent'
};
</script>
问题是,当我尝试运行该应用程序时,出现空白页面。这行
var myAtom = new Atom(atomicConfig);
中断了应用程序。为什么会这样?我的猜测是在组件的脚本中未定义Atom。我要在第一行中导入内容吗?为什么不能像仅使用纯html和js文件运行的npm软件包所提供的示例应用程序那样工作?原谅我的经验不足,我是javascript框架的新手。先感谢您。
最佳答案
通常,要在Webpack项目中导入npm模块,请先将 npm-install
包打包,然后再将 import
或 require
导入代码中的模块。例如:
import _ from 'lodash';
// OR
const _ = require('lodash');
demo
在您的情况下,
atomic-bohr-model
仅声明window.Atom
,并且不导出任何符号,因此您需要像这样导入它:import 'atomic-bohr-model/dist/atomicBohrModel.min.js'; // sets window.Atom
// OR
require('atomic-bohr-model/dist/atomicBohrModel.min.js'); // sets window.Atom
然后,您的组件将在
window.Atom
生命周期 Hook 中使用mounted
,此时将呈现模板,并且#bohr-model-container
可用:<template>
<div id="bohr-model-container" style="width: 200px; height: 200px"></div>
</template>
<script>
import 'atomic-bohr-model/dist/atomicBohrModel.min.js';
export default {
mounted() {
new window.Atom({
containerId: '#bohr-model-container',
numElectrons: 88,
// ...
});
}
};
</script>
demo