译者:方应杭  来源:知乎 原文:https://zhuanlan.zhihu.com/p/143835487

本文是一篇译文,原文在 Hackers News 上的点数超过 200 点。

我的朋友是一位著名的计算机科学家,他之前没有用过 JS,今天他需要用到 GitHub 的一个 JS 库。而我在过去的 6 年主要的工作是在麻省理工学院进行可用性研究和教学,所以我其实也没什么把握。最终,我们俩出来搞出一堆错误之外一无所获,他也放弃了这个 JS 库。这篇文章我将试着为你道出他在这个过程中遇到的各种状况,以及心中的沮丧。

故事是这样的……(注意,库名和人名都经过了加工以避免隐私泄露,有些错误我直接忽略了,还有些错误我是凭记忆回忆的,所以如果我说错了,还请指出)

约翰:嘿,我在 GitHub 上找到了一个算法,介绍里说使用 import functionName from packageName 就可以调用 functionName(arguments) 来使用这个算法了,看起来很简单,看起来我只需要安装 Node 就可以搞定它了!

我:恩,Node 可以。

然后约翰运行了 npm install packageName --save,因为库的 README 里是这样说的。

接着,他运行了 node index.js

Node 报错:

Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension. SyntaxError: Cannot use import statement outside a module

约翰:哪来的** package.json** 啊……

我:运行 npm init 就会自动创建一个 package.json  哦

好吧,约翰运行了 npm init,并按照命令行的步骤依次进行设置,最后约翰在 package.json 里面加了一句 type: "module"

接着,他再次运行了 node index.js

Node 报错:

SyntaxError: Cannot use import statement outside a module

约翰感到很奇怪,因为这个错误是这个 JS 库内部文件抛出来的。怎么会这样?

我:继续吧,这个报错应该没关系,你试试直接在浏览器里运行吧,不用 Node 了。这应该是一个 ES6 模块,它是一个算法,没有用到 Node 的 API,所以直接用浏览器就行。

约翰听从了我的建议,他创建了 index.html 文件,然后在里面添加了一行 。然后用浏览器打开了 index.html

然而,控制台没有如期地显示出结果。

我:欧,我忘了说了,你需要调整一下路径。Node 会自动从 node_modules 里加载 JS 文件,但是 Firefox 不会这么做,你需要自己把路径写全。

约翰查看了文件目录,发现并没有 node_modules 文件夹。

我:好吧,你刚刚是不是先运行的 npm install 后创建的 package.json,应该是这样,你需要再次运行 npm install 才会出现node_modules 目录。

约翰再次运行了 npm install packageName --save

约翰:你说得对,现在有 node_modules 目录了。

约翰绝望地翻阅着 node_modules 目录,最终找到了 JS 文件的完整路径。

然后约翰把文件路径更新到了** index.js** 。

Firefox 报错:

Incorrect MIME type: text/html

我:欧,你不能用 file:// 协议来打开 index.html。你需要在本地启动一个 HTTP 服务,file 协议里的 JS 是被严重限制的。

约翰:但是我为什么要……好吧,我启动一个 HTTP 服务器就行了吧。

接着,约翰在启动了一个 HTTP 服务,然后用浏览器访问 http://localhost:80

Firefox 报错:

Incorrect MIME type: text/html

约翰:唉,我是不是应该给 JS 文件加上 text/javascript MIME 类型?

我:不应该啊,这应该是自动加上的。呃……你打开 Network,我怀疑是因为浏览器找不到你的 JS 库文件,于是返回了 404 页面,404 页面被当作 JS 文件才会报这个错。

我们重新查看文件目录,发现 VSCode 默认合并了某些目录,导致约翰写错了路径。我觉得 VSCode 的这个功能虽然方便,但是 VSCode 应该给出明显的提示才好。

Firefox 报错:

SyntaxError: missing ) after formal parameters

我:怎么会这样,难道是这个包的源代码本身就有错误。我们点开这个错误提示看看是哪一行报错吧。

约翰点开了对应的文件。

我:天啊,这不是 JS 文件,这是 TypeScript 啊。但是这个文件的后缀是 .js 啊!

约翰:我只是想测试一个 JS 算法啊……

约翰最终放弃了,并说再也不想碰 Node、npm 和 ES6 模块了。

故事讲完了。

大家注意,约翰是一个计算机科学家,对 Web 懂得不少,他已经安装了 Node 和 npm,他也知道 MIME types 是什么,他也会自己启动一个 HTTP 服务器。如果他是一个新手,那就真的没希望(搞定这个库)了。

译文完。

接下来我摘录一些文章的评论。

Manoel Vilela 说:四年前我说 JS 的开发流程(以及 JS 本身)就是辣鸡,被其他人喷。这篇文章并不会令我惊讶,故事很有趣(也很悲哀)。新人没有希望,只有痛苦和难受。

The Dan 回复 Manoel Vilela 说:不只是新人。

tjholowaychuk 说:还是这么乱哈 :D

相关热门推荐【第 244 期】小智周末学习发现了 10 个好用JavaScript图像处理库【第 243 期】前端!7个快速发现 bug 神仙调试工具【第 242 期】小智在这3年开发中遇到的 CSS 问题及解决方案,有大佬帮他总结好了 !「前端编程实战 40」新拟物 checkbox 特效【第 241 期】JavaScript重构技巧 — 条件【第 240 期】ES2020 新特性出炉了,你最喜欢哪一个呢?【第 239 期】JavaScript重构技巧 — 对象和值

html js加载404_【第 245 期】2020 年,JS 令一个新人沮丧相关推荐

  1. 【第 245 期】2020 年,JS 令一个新人沮丧

    译者:方应杭  来源:知乎 原文:https://zhuanlan.zhihu.com/p/143835487 本文是一篇译文,原文在 Hackers News 上的点数超过 200 点. 我的朋友是 ...

  2. js加载html的head偶尔失效,外部 js 文件偶尔会加载失败

    最近有一个很奇怪的问题一直困扰着我: html 页面中,head部分引入了几个外部js文件. 比如: // 目前页面结构就是这样,其他的代码都和此异常无关,就不多贴了. // 这里就直接报错,显示 V ...

  3. python爬取js加载的数据_Python爬虫:爬取JS加载数据的网页

    比如简书: Paste_Image.png 我们来写个程序,爬取简书网站随便一个作者的所有文章,再对其所有文章进行分词统计 程序运行统计的结果见文章: 我统计了彭小六简书360篇文章中使用的词语 需要 ...

  4. three.js 加载gltf模型的简化demo

    目录 前言 下载依赖 改造插件 主要代码 效果 前言 最近需要做一个three.js加载三维模型的,才发现three.js的官网和网上的示例挺乱的.甚至有人说把three.js的全部demo下载下来, ...

  5. VR 效果 前端使用 three.js 加载 Obj,drc文件(三维模型文件)

    VR 效果 前端使用 three.js 加载 Obj(三维模型文件) 前言:我对 three.js 并不熟!只是朋友有这个需求,写了几个 demo 运行,能看~.如果想深入学习,还需要多看看官方文档, ...

  6. three.js 加载显示文字

    three.js 加载显示文字 代码放到 ./three.js/examples/ 下 <!DOCTYPE html> <html lang="en">&l ...

  7. node中怎样将css导入到html,CSS无法使用Node.js加载到我的HTML代码中

    我想通过Node.js使用express()函数在localhost:3000中将CSS添加到我的HTML中. 不幸的是,有些奇怪.我一步一步按照教程中的步骤,但仍然无法加载我的CSS.我的style ...

  8. 优化JS加载时间过长的一种思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 去年公司在漳州的一个项目中,现场工程人员反映地图部分出图有点 ...

  9. 首次使用three.js加载obj模型未成功

    接此,https://blog.csdn.net/bcbobo21cn/article/details/110676331 基本代码如下: <!DOCTYPE html> <html ...

  10. python爬取js加载的数据_Python爬虫学习,记一次抓包获取js,从js函数中取数据的过程...

    昨天有小伙伴找我,新浪新闻的国内新闻页,其他部分都是静态网页可以抓到,但是在左下方的最新新闻部分,不是静态网页,也没有json数据,让我帮忙抓一下.大概看了下,是js加载的,而且数据在js函数中,很有 ...

最新文章

  1. Docker 17.03系列教程(一)Docker EE/Docker CE简介与版本规划
  2. python基础入门:bytes 和 string转换的方法
  3. java 中符号_谁能告诉我java中符号的用法,见代码
  4. 攻克学习多线程时碰到的难题(zz)
  5. ZooKeeper配额指南
  6. 03 unix 设计哲学和流重定向
  7. Google 的 Angular 迫使我放弃了 Web 开发
  8. CentOS 6U7分区大于2TB的磁盘以及挂载大于16TB分区磁盘的解决方案
  9. linux 查看设备 usb设备驱动程序,Linux USB设备驱动程序未被探测
  10. 2021-09-08Cloudera Manager集群报警,堆转储目录/tmp 或日志目录/var/log 可用空间小于 5.0 吉字节
  11. cmd设置文件兼容性
  12. 3D模型欣赏:汉服美女 【3D游戏建模教程】
  13. Lead-follower因子:新闻共现股票收益的关联性研究
  14. BZOJ4372: 烁烁的游戏(动态点分治)
  15. 操作系统导论期末复习题
  16. 【历史上的今天】11 月 4 日:“光纤之父”出生;StumbleUpon 诞生;谷歌推出 Google Home
  17. 图像所征服你的七种武器
  18. CKA和HCIE那个证书含金量高?
  19. div怎样显示在最顶层
  20. 布隆过滤器简单实现添加和判断功能

热门文章

  1. java中Field中的方法,解析Java中的Field类和Method类
  2. SpringApplication#run⽅法第5步,打印banner(四)
  3. com.sun:tools
  4. MySQL自定义函数用法详解-复合结构自定义变量/流程控制
  5. Oracle踩坑之解决数值0.2只显示成.2方法
  6. SpringBoot中Interceptor和Filter的使用
  7. 屏蔽Codeforces做题时的Problem tags提示
  8. 奇虎360-数据可视化
  9. 百度要革自己的命?移动搜索或取消PC网页收录
  10. 从使用Python开发一个Socket示例说到开发者的思维和习惯问题