ES6导入npm模块

时间:2019-02-10 23:57:51

标签: javascript node.js es6-modules

我开始进行Web开发,无法将使用npm i MODULE -S安装的模块导入.html内的script中。我的文件结构类似于:

设置:

    project
    |_ node_modules
    |_ public
    |   |_ css
    |   |_ js
    |   |   |_ libs
    |   |   |_ index.mjs
    |   |_ index.html
    |_ server
        |_ server.mjs

index.html文件非常简单,类似于:

<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="css/styles.css">
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>JSON and AJAX</title>

    <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> -->
  </head>

  <body>
    <header>
      <h1>JSON and AJAX</h1>
      <button id="btn">Fetch Info for 3 New Objects</button>
    </header>

    <div id="animal-info"></div>

    <script type="module" src="js/index.mjs"></script>

    <div id="msgid"></div>
  </body>
</html>

index.mjs文件:

import $ from 'jquery';

为完整起见,server.mjs文件

// const path = require('path');
import path from 'path';

import express from 'express';

const app = express();

const __dirname = path.resolve();
const publicPath = path.join(__dirname, '/public');
app.use(express.static(publicPath));

const port = process.env.PORT || 8080;
app.set('port', port);

app.listen(app.get('port'), () => {
    console.log(`listening on port ${port}`);
});

PROBELM

当我运行node --experimental-modules server/server.mjs时,我的页面就会加载并且可以在localhost:8080中访问它,但是当我在chrome中打开开发者工具时,会遇到以下错误:

Uncaught TypeError: Failed to resolve module specifier "jquery". Relative references must start with either "/", "./", or "../".

尝试的分辨率

1)我已将index.mjs文件中的import语句更改为:

import $ from '.jquery';

import $ from './jquery';

'import $ from '../../node_modules/jquery';

输出以下消息:

GET http://localhost:49160/js/jquery net::ERR_ABORTED 404 (Not Found)

GET http://localhost:49160/js/jquery net::ERR_ABORTED 404 (Not Found)

GET http://localhost:49160/node_modules/jquery net::ERR_ABORTED 404 (Not Found)

2)我试图将jquery目录中的node_modules文件夹复制到libs目录中并重新运行,以便index.js仅具有以下代码:

import $ from './libs/jquery';

但出现以下错误:

GET http://localhost:49160/js/libs/jquery/ net::ERR_ABORTED 404 (Not Found)

额外

当我遵循Mozilla developer页上的文档并开发自己的模块时,一切正常,但是当我尝试使用第三方模块时,会遇到一系列错误。

3 个答案:

答案 0 :(得分:1)

正确的导入是

import * as $ from 'jquery';

答案 1 :(得分:1)

TLDR;

import $ from '/js/libs/jquery/dist/jquery.js'

import $ from './libs/jquery/dist/jquery.js'

您的两次尝试有两个不同的问题。

  

import $ from 'jquery';

这种按名称的导入将不起作用,因为您的浏览器不知道在何处搜索jquery。根据浏览器的不同,如果服务器的根目录(/ public)中有一个jquery.js文件,它可能会工作,但不能保证。

  

从'.jquery'导入$;

     

从'./jquery'导入$;

     

'从'../../node_modules/jquery'导入$;

不幸的是,这些都是错误的道路。 ES6模块是从文件而不是从目录加载的,而package.json被忽略。因此,所有这些最终都需要dist/jquery.js才能有机会。另外,根据您的目录结构,没有一个是正确的(假设jquery目录位于/ public / js / libs中)。第二个是关闭,但开头缺少./libs

答案 2 :(得分:0)

CDN

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>

NPM类型安装

npm install @types/jquery --save-dev

TypeScript参考

/// <reference types="jquery" />

关键是要认识到jQuery可通过全局范围访问 https://www.typescriptlang.org/docs/handbook/declaration-files/library-structures.html#global-libraries

,并且可以通过reference关键字而不是import进行引用 https://www.typescriptlang.org/docs/handbook/declaration-files/library-structures.html#dependencies-on-global-libraries