出处 https://www.cnblogs.com/daysme/

- 2018-01-06

昨晚找了一个代码解决了我对配置的需求。
高兴的拿到手机上测试却发现点击没有效果,电脑上是可以的呀,电脑上的手机模式是可以的呀。

难道是这代码不兼容手机?可能吧,再找找其他代码,把关键词下的都看完了,没有其他可用的。

在手机上搞个 console ,看到是由于手机上显示 tool is not defined , tool 是这个工具的构造函数。难道是转换后的 js 手机版浏览器不支持?可能吧。那么到底是什么代码不支持呢?
看了生成后的文件,应该是最后一步 tool 没有被导出。
入口文件源码是这样的:

  import tool from './tool';
module.exports = tool;

下面的文章,都是自己编译、修改源码导致的报销,在浏览器上也不能运行,先是 tool is not defined, 后是 exports is not defined。

应该是手机不支持转换后的模块加载方式。然后我打算把他的代码放到我之前的项目里去转换。你问我为什么不使用他自己的项目转码?我也想,因为他项目好像不是在 windows 开发的,并且使用了一些非 windows 平台的命令,如 rm 、 mkdir ,我换成 windows 上的 rd 和 md 及对应的语法格式,或删除这些不支持的命令去手动操作,都没有用,而且他的项目里几乎都是使用全局安装的工具转换, node-sass 、 babel … 。他执行命令时是通过一条命令把这些命令串连起来的,有些工具全局安装后不知道如何使用,最后就抛弃了这种方式。

当然,我使用自己的项目去转换他的代码,也并没有成功,报错还是相同的。

尝试把他的代码合并在一起以去除模块依赖,然后代码并不能运行。我想如果我对es6了解再熟悉一点的话之条路应该可能走通。但我知道这是一条不归之路,可不能为了运行代码,把前沿的东西都给改落后了,对不起作者,自己也没面子。

尝试使用在线的 babel 和 require.js 来直接加载未来编译过的 js ,不知道是不是自己的使用方式不对,报错还是一样。

还是继续看源码,再百度,发现好像作者使用的是 module.exports ,网上说这是 CommonJS 规范(四个关键字, module, exports, require, global),一般用在 node 里比较多, 浏览器是不能运行的。 AMD 规范使用的是 require([module], callback); 形式。 require.js 使用的是 AMD 规范,他能在浏览器里运行。那么难道是因为作者写的是 CommonJS ,我却用 require.js 去加载,才导致的报错?然后就开始搜索解决 CommonJS 和 AMD 规范之前问题的方法,结果没有成功,不知道如何使用。

后来想不到其他办法了,决定沉下心来,看看能不能改写作者的源码。我想的只是反正都是规范搞的鬼,那模块化规范也就那几句,也一共才导入三四个文件,应该能手动改成之前项目里自己写过的那种可以编译在浏览器里运行的模块化方式。随便看了一下 package.json ,发现好像别一个名字有点可疑 babel-preset-env ,自己以前的项目里没有遇到过,看起来像是某种转换方式。百度了一下,发现是用来转换不同环境的代码的,比如仅在 node ,仅在 chrome ,而不是把所有代码通通转为 es5 ,因为现在大部分浏览器都支持很多 es6 语法了,没必要全部转换,也的确作者的 package.json 里并没有 babel-preset-es2015 。 想着为什么作者的示例不能在手机上运行,或许就是故意使用了特定的转换方式,可是手机浏览器不如电脑更新快,支持度不高导致报错。

遂赶快安装了 babel-preset-es2015 , 运行 browserify -s tool -e ./src/index.js -o ./dist/tool.js -t [ babelify --presets [env] ] 试试。行一下,官网上的例子 不是 browserify a.js -o b.js 吗这里多了个 -s 是什么鬼?去官网看了下大概是什么 UMD 规范,之前的搜索 CommonJS 和 AMD 时有记得 UMD 是为了兼容这两个的规范的。把 -s 去掉 browserify ./src/index.js -o ./dist/configui.js -t [ babelify --presets [env] ] , 果然作者的代码编译出来也不能在电脑上用了,还是报了 tool is not defined 这个错,加上 -s 就好了, 使用 [es2015] 手机能运行了。

原来, 作者本就使用了兼容 CommonJS 和 AMD 的兼容规范 UMD, exports is not defined 这个坑是我自己挖出来的。走了这么多弯路, get 到 browserify 有个 -s 参数可以用来做模块化兼容,有个 babel 插件 babel-preset-env 可以用来转换为指定环境代码。

​

一个 xxx is not defined 引发的爬坑之路的更多相关文章

  1. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  2. Vue 爬坑之路(六)—— 使用 Vuex + axios 发送请求

    Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource 目前主流的 Vue 项目,都选择 axios ...

  3. Vue 爬坑之路(九)—— 用正确的姿势封装组件

    迄今为止做的最大的 Vue 项目终于提交测试,天天加班的日子终于告一段落... 在开发过程中,结合 Vue 组件化的特性,开发通用组件是很基础且重要的工作 通用组件必须具备高性能.低耦合的特性 为了满 ...

  4. Vue 爬坑之路(一)—— 使用 vue-cli 搭建项目

    vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli vue ...

  5. Vue 爬坑之路(十二)—— vue-cli 3.x 搭建项目

    Vue Cli 3 官方文档:https://cli.vuejs.org/zh/guide/ 一.安装 @vue/cli 更新到 3.x 之后,vue-cli 的包名从 vue-cli 改成了 @vu ...

  6. Tinker爬坑之路

    目的 热修复去年年底出的时候,变成了今年最火的技术之一.依旧记得去年面试的时候统一的MVP,然而今年却变成了RN,热修复.这不得不导致我们需要随时掌握最新的技术.不然可能随时会被淘汰.记得刚进公司,技 ...

  7. 安卓易学,爬坑不易——腾讯老司机的RecyclerView局部刷新爬坑之路

    针对手游的性能优化,腾讯WeTest平台的Cube工具提供了基本所有相关指标的检测,为手游进行最高效和准确的测试服务,不断改善玩家的体验.目前功能还在免费开放中. 点击地址:http://wetest ...

  8. Android爬坑之路

    做了那么久前端,现在终于可以回到我的老本行, 今天我用了一天的时间配置里Android开发环境,mac和windows双平台,eclipse和IDEA双平台,别问为什么,我就喜欢,中间大坑不断,再加上 ...

  9. 安卓易学,爬坑不易—腾讯老司机的RecyclerView局部刷新爬坑之路

    前言 安卓开发者都知道,RecyclerView比ListView要灵活的多,但不可否认的里面的坑也同样埋了不少人.下面让我们看看腾讯开发工程师用实例讲解自己踩坑时的解决方案和心路历程. 话说有图有真 ...

随机推荐

  1. MongoDB在windows上的安装

    D:\MongoDB\Server\4.0\bin 下载地址:https://www.mongodb.com/download-center/community 中文教程:http://www.run ...

  2. python实现堆栈和队列

    利用python列表实现堆栈和队列 堆栈: 堆栈是一个后进先出的数据结构,其工作方式就像生活中常见到的直梯,先进去的人肯定是最后出. 我们可以设置一个类,用列表来存放栈中的元素的信息,利用列表的app ...

  3. 利用可排序Key-Value DB构建时间序列数据库(简论)

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/5855064. ...

  4. 洛谷 P1106 删数问题

    一定要认真审题   “去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的正整数”   也就是说 输入:7893400   4     输出:300  (00在原顺序中位于3后边) 输入:789 ...

  5. Spring Boot 实现RESTful webservice服务端示例

    1.Spring Boot configurations application.yml spring: profiles: active: dev mvc: favicon: enabled: fa ...

  6. C Language Deep Analyse

    1.记录几个少见的关键字    auto 声明为自动变量,缺省时编译器一般默认为auto    register 声明寄存器变量    volatile 说明变量在程序执行中可被隐含地改变    ex ...

  7. OLED屏幕那些次像素有趣的排列方式

    http://www.dzsc.com/data/2016-6-2/109856.html 我们今天的重点内容为倒数第二列内容的上半部分,也就是RGB排列和Pentile排列.在介绍OLED屏幕时候我 ...

  8. matplotlib 画动态图以及plt.ion()和plt.ioff()的使用

    学习python的道路是漫长的,今天又遇到一个问题,所以想写下来自己的理解方便以后查看. 在使用matplotlib的过程中,常常会需要画很多图,但是好像并不能同时展示许多图.这是因为python可视 ...

  9. Markdown语法学习(Github/git.oschina.net上README.md书写规范)(转)

    晚上在更新git.oschina.net项目时,突然想知道README.md后缀的来源,于是搜了下,发现README.md使用了一种小标记语言Markdown的语法,于是简单的看了一个,特转载如下,为 ...

  10. Linux普通用户使用sudo免输密码(Debian/Redhat通用)

    今天使用的Debian,由于使用的是普通用户,而使用的sudo都需要输入密码的繁琐操作, 下面是使用sudo时免输入密码. 需要管理员权限进行以下操作. 修改sudoers vim /etc/sudo ...