整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

都2021年了,做个Chrome插件给自己吧

都2021年了,做个Chrome插件给自己吧

着入职时间变长,工作不断的深入,在需要同时处理多个任务的同时,打开几十上百个浏览器 Tab 页就必不可少了,而我的工作几乎都是在各种浏览器 Tab 页之间来回切换,如写文档、学习新知识、处理 Bug 单流转、上线等流程,所以我需要对浏览器的 Tab 页进行精细化管理,以达到精细化管理工作流程的目的,于是乎,我对于浏览器的使用变成了下面几个阶段:

Chrome - 杂乱无章阶段

Chrome - 进行适当整理

Edge - 竖向侧边栏

但是无论浏览器层面提供多少这样或那样的辅助,但毕竟浏览器的职责主要是负责帮助你更好、更快、更高效的浏览网页,并非是帮你管理知识和工作流程,所以如果需要个性化定制的需求,就得自己上手开发啦!毕竟作为程序员,自己动手,丰衣足食嘛 。

需求分析

我希望能够开发一个 Chrome 浏览器插件,当前其他浏览器如 Edge、Firefox、Brave,以及其他所有使用 Chromimum 开发的浏览器都是支持 Chrome 插件格式的,而这几大浏览器几乎占据了近 83% 左右的桌面端浏览器市场,所以这个 Chrome 插件可以在我喜欢的浏览器上运行。

以下是 2020.3 到 2021.3 的桌面端浏览器占比数据

这个浏览器支持传统的插件点击弹出栏,以及每次打开一个新 Tab 都能展示我的应用,这样能够帮助我随时了解我当前正在进行的工作,大致形式如下:

弹出栏:

新 Tab:

针对上面需求的形式不知道大家是否比较熟悉了?没错,这个插件的框架形式和 掘金 的插件类似,我们看下掘金的 Chrome 插件:

弹出框:

新 Tab:

也就是说,在看完本次文章,你基本上拥有了开发一个掘金插件的能力,心动了?

随便一提,我们本次开发插件的技术栈如下:

  • React + TypeScript,基于 Create-React-App 脚手架搭建

通过先进的技术栈来编写 Chrome 插件。

前置知识

Chrome 插件实际上包含几个部分:

  • manifest.json 文件,相当于整个项目的入口,里面记录着此插件的 icon 图标展示、弹出框样式文件、新建 Tab 逻辑、选项逻辑、内容脚本逻辑等
  • background.js,此脚本是在整个浏览器启动或者插件加载之后就会运行的一个脚本文件,它运行在 ServiceWorker 里面,通常用于进行一些前置的数据 storage 存储操作,可以操作所有的 Chrome API
  • popup.html,插件的弹出框展示的模板内容,可以通过 CSS 控制样式,JavaScript 控制逻辑
  • options.html,右键插件 icon 时弹出菜单页,点击菜单页里面的选项打开的页面
  • content.js,此脚本是在你打开一个新的网页的时候,Chrome 浏览器为这个网页注入的一个脚本文件,用于辅助此网页和你的插件进行一个通信,因为插件的运行环境是经过沙盒隔离的,无法直接操作到 DOM,所以需要通过 content 脚本操作 DOM,然后发送给到插件的处理逻辑

上述 5 大文件组成了一个 Chrome 插件所需要的必须元素,逻辑关系如下:

image.png

可以看到,其实开发一个 Chrome 的插件也是使用 HTML/JavaScript/CSS 这些知识,只不过使用场景,每种 JavaScript 使用的权限与功能、操作的 API 不太一样,那么既然是使用基本的 Web 基础技术,我们就可以借助更为上层的 Web 开发框架如 React 等来将 Chrome 插件的开发上升到一个现代化的程度。

最简化插件

确保你安装了最新版的 Node.js,然后在命令行中运行如下命令:

npx create-react-app chrome-react-extension --template typescript

初始化好项目、安装完依赖之后,我们可以看到 CRA 产生的模板代码,其中就有我们需要的 public/manifest.json 文件:

当然内容并没有我们上图那样丰富我们需要做一些修改,将内容改为如下内容:

{
   "name": "Chrome React Extension",
   "description": "使用 React TypeScript 构建 Chrome 扩展",
   "version": "1.0",
   "manifest_version": 3,
   "action": {
       "default_popup": "index.html",
       "default_title": "Open the popup"
   },
   "icons": {
       "16": "logo192.png",
       "48": "logo192.png",
       "128": "logo192.png"
   }
}

上述的字段说明如下:

  • name:插件的名字,展示在 Chrome 插件 icon 里面,以及插件市场等
  • description:简介插件时干嘛的
  • version:插件当前的版本
  • manifest_version:当前使用的 manifest 文件的版本,Chrome 插件最小的 manifest 版本是 V3
  • action:控制点击插件 icon 时的需要反应的动作(action),这里我们设置 hover 时展示的文字为 default_title,点击打开展示的内容为 index.html
  • icons:为展示在 Chrome 插件里面的图标

实际上 Chrome 插件只能理解原生的 JavaScript,CSS,HTML 等, 所以我们使用 React 学完之后,需要进行构建,将构建的产物打包给到浏览器插件去加载使用,在构建时,还有一个需要注意的就是,为了保证最优化性能,CRA 的脚本在构建时会将一些小的 JS 文件等,内联到 HTML 文件中,而不是打包成独立的 JS 文件,在 Chrome 插件的运行环境下,这种形式的 HTML 是不支持的,会触发插件的 CSP(内容安全策略)错误。

所以为了测试我们的插件当前效果,我们修改构建脚本,在 package.json 里面:

"scripts": {
    "start": "react-scripts start",
    "build": "INLINE_RUNTIME_CHUNK=false react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },

通过设置 INLINE_RUNTIME_CHUNK=false 确保所有的 JS 会构建成独立的文件,然后引入到 HTML 中加载使用。

一切准备完毕,是时候构建我们的 React 应用了~ 在命令行中运行如下命令:

npm run build

会发现内容构建输出在 build/xxx 下面,包含 manifest.json、index.html、对应的 JS/CSS 文件还有图片等,其中 manifest 中索引了 index.html 来作为点击插件时的 Popup 的展示页,这个时候我们就可以使用 Chrome 加载我们构建好的文件,来查看插件运行效果了:

我们打开扩展程序面板,设置开发者模式,然后点击加载文件,选择我们的 build 文件地址加载:

Magic !我们可以在浏览器里面看到我们的插件,并使用它了,一个最简化插件完成!

当然这里我们虽然能够使用 React/TypeScript 以及一切现代的 Web 开发技术来写插件,但是目前没有很好的方式能够实时的进行开发-查看效果,就是我们常见的 HMR、Live Reload 这种技术暂时还没有很好的支持到 Chrome 插件的开发,所以每次我们需要查看编写的效果都需要构建之后点击插件查看。

当然如果纯针对 UI 或者和 Chrome API 无关的逻辑,那么你可以放心的直接在 Web 里面开发,等到开发完毕再构建到 Chrome 插件预览即可。

定制新 Tab 逻辑

我们之前的逻辑是,只要新开一个 Tab,那么就会访问我们提供的页面,类似掘金的插件,而且我们也主要到,其实针对 Popup 页面只是几个按钮,而重头戏都在新 Tab 页界面展示,也就是我们这里其实需要一个多页应用?因为最终要生成页面,一个用在 Popup 页面展示,一个用在新 Tab 页展示。

但是我们知道 CRA 脚手架生成的模板是主要用于单页应用,如果需要切换到多页应用有一定的成本,但是我们的 Popup 页面实际上就只有几个按钮,所以这里可以做一层简化,即 Popup 页面直接手动写最原始的 HTML/JS/CSS,然后将重头戏、复杂的新 Tab 页的逻辑来用 React TypeScript 等现代 Web 技术来开发。

通过这样设计之后,我们的目录结构变成了如下形式:

其中 manifest.json 的逻辑变成了如下:

{
  "name": "Chrome React SEO Extension",
  "description": "The power of React and TypeScript for building interactive Chrome extensions",
  "version": "1.0",
  "manifest_version": 3,
  "action": {
    "default_popup": "./popup/index.html",
    "default_title": "Open the popup"
  },
  "chrome_url_overrides": {
    "newtab": "index.html"
  },
  "icons": {
    "16": "logo192.png",
    "48": "logo192.png",
    "128": "logo192.png"
  }
}

我们可以看到,点击 Chrome 插件弹出的页面 Popup,换成了 ./popup/index.html ,而我们新加了一个 chrome_url_overrides 字段,在 newtab 时,我们打开构建后的 index.html 文件。

通过上面的操作,我们每次打开一个新 Tab,都会展示下面的页面:

完美!我们已经实现了掘金的插件的核心思想:便捷的获取技术知识,就在你每次打开 Tab 时。

开发 Popup 页面

接下来我们尝试改造一下我们的 Popup 页面,同样是对标掘金,我们知道掘金的 Popup 页面是一个比较简单的菜单栏,里面主要是一些用于跳转到新 Tab 或者设置页的操作:

我们现在也需要实现类似的点击某个按钮,跳转到我们新 Tab 页,打开我们上一部分定制的 Tab 逻辑。

这一部分我们就需要修改 popup/index.html ,添加相关的 JS 逻辑如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Fake Juejin Extensions</title>
    <link rel="stylesheet" href="./styles.css" />
  </head>
  <body>
    <ul>
      <li class="open_new_tab">打开新标签页</li>
      <li class="go_to_github">访问 Github</li>
      <li class="go_to_settings">设置</li>
    </ul>
    <script src="popup.js"></script>
  </body>
</html>

这一次需求我们只会操作打开新标签页、访问 Github,设置我们不做操作,留给读者自己去扩展。

可以看到我们导入了 popup.js 文件,在这个 JS 文件里,我们需要完成对应打开新标签页、和访问 Github 的逻辑配置:

document.querySelector(".open_new_tab").addEventListener("click", (e)=> {
  chrome.tabs.create({}, ()=> {});
});

document.querySelector(".go_to_github").addEventListener("click", (e)=> {
  window.open("https://github.com");
});

可以看到,因为 popup.js 是运行在 Chrome 插件的沙箱环境下的,所以它能够使用到 chrome 这个 API,进行页面、浏览器等相关的操作。

当我们写入了上述逻辑之后,我们就可以点击对应的打开新标签页,访问新标签页并展示我们上一节说到的内容,访问 Github,则会跳转到 Github 页面。

使用 Content 脚本

我们已经开发了新 Tab 页,开发了 Popup 逻辑,接下来我们可以尝试一下通过 content 脚本,来实现用户页面与插件脚本进行通信,以间接的操作 DOM。

首先我们需要在 manifest.json 里面注册 content 相关的脚本:

{
  "name": "Chrome React Extension",
  // ...
  "permissions": ["activeTab", "tabs"],
  "content_scripts": [
    {
      "matches": ["http://*/*", "https://*/*"],
      "js": ["./static/js/content.js"]
    }
  ]
}

上述脚本通过 content_scripts 指定 content 脚本,matches 指定匹配到那些域名时,才执行这个注入脚本的逻辑,js 代表需要注入的脚本的位置,这里我们填写的为 ./static/js/content.js ,即为通过构建之后产生的 JS 内容地址。

接着我们在 Tab 页的 React 项目里面去建立与 content 脚本的通信:

import React from "react";
import "./App.css";
import { DOMMessage, DOMMessageResponse } from "./types";

function App() {
  // 前置逻辑

  React.useEffect(()=> {
    /**
     * We can't use "chrome.runtime.sendMessage" for sending messages from React.
     * For sending messages from React we need to specify which tab to send it to. */     chrome.tabs &&
      chrome.tabs.query(
        {
          active: true,
          currentWindow: true,
        },
        (tabs)=> {
          /**
           * Sends a single message to the content script(s) in the specified tab,
           * with an optional callback to run when a response is sent back.
           *
           * The runtime.onMessage event is fired in each content script running
           * in the specified tab for the current extension. */           chrome.tabs.sendMessage(
            tabs[0].id || 0,
            { type: "GET_DOM" } as DOMMessage,
            (response: DOMMessageResponse)=> {
              setTitle(response.title);
              setHeadlines(response.headlines);
            }
          );
        }
      );
  });

  return (
    // ... 模板
  );
}

export default App;

可以看到我们通过 chome API,去查询当前正在激活的 Tab 页,然后给这个 Tab 页的 content 脚本,通过 chrome.tabs.sendMessage 发了一个 { type: "GET_DOM" } 的消息。

然后我们创建对应的 content 的脚本,在 src/chromeServices 下创建 DOMEvaluator.ts

import { DOMMessage, DOMMessageResponse } from "../types";

// Function called when a new message is received const messagesFromReactAppListener=(
  msg: DOMMessage,
  sender: chrome.runtime.MessageSender,
  sendResponse: (response: DOMMessageResponse)=> void
)=> {
  console.log("[content.js]. Message received", msg);

  const headlines=Array.from(document.getElementsByTagName<"h1">("h1")).map(
    (h1)=> h1.innerText
  );

  // Prepare the response object with information about the site   const response: DOMMessageResponse={
    title: document.title,
    headlines,
  };

  sendResponse(response);
};

/**
 * Fired when a message is sent from either an extension process or a content script. */ chrome.runtime.onMessage.addListener(messagesFromReactAppListener);

这个脚本在加载的时候,通过 onMessage.addListener 监听,然后回调 messagesFromReactAppListener ,在函数里面,可以直接获取 DOM,查询这个页面中的 标题 和所有的 H1 标签,然后返回。

import React from "react";
import "./App.css";
import { DOMMessage, DOMMessageResponse } from "./types";

function App() {
  const [title, setTitle]=React.useState("");
  const [headlines, setHeadlines]=React.useState<string[]>([]);

  // ...消息通信逻辑

  return (
    // ... 模板
    <div className="App">
      <h1>SEO Extension built with React!</h1>

      <ul className="SEOForm">
        <li className="SEOValidation">
          <div className="SEOValidationField">
            <span className="SEOValidationFieldTitle">Title</span>
            <span
              className={`SEOValidationFieldStatus ${
                title.length < 30 || title.length > 65 ? "Error" : "Ok"
              }`}
            >
              {title.length} Characters
            </span>
          </div>
          <div className="SEOVAlidationFieldValue">{title}</div>
        </li>

        <li className="SEOValidation">
          <div className="SEOValidationField">
            <span className="SEOValidationFieldTitle">Main Heading</span>
            <span
              className={`SEOValidationFieldStatus ${
                headlines.length !==1 ? "Error" : "Ok"
              }`}
            >
              {headlines.length}
            </span>
          </div>
          <div className="SEOVAlidationFieldValue">
            <ul>
              {headlines.map((headline, index)=> (
                <li key={index}>{headline}</li>
              ))}
            </ul>
          </div>
        </li>
      </ul>
    </div>
  );
}

export default App;

然后扩展一下 CSS 代码:

.App {
  background: #edf0f6;
  padding: 0.5rem;
}

.SEOForm {
  list-style: none;
  margin: 0;
  box-shadow: 0 1px 3px 0 rgb(0 0 0 / 10%), 0 1px 2px 0 rgb(0 0 0 / 6%);
  background: #fff;
  padding: 1rem;
}

.SEOValidation {
  margin-bottom: 1.5rem;
}

.SEOValidationField {
  width: 100%;
  display: flex;
  justify-content: space-between;
}

.SEOValidationFieldTitle {
  font-size: 1rem;
  color: #1a202c;
  font-weight: bold;
}

.SEOValidationFieldStatus {
  color: #fff;
  padding: 0 1rem;
  height: 1.5rem;
  font-weight: bold;
  align-items: center;
  display: flex;
  border-radius: 9999px;
}

.SEOValidationFieldStatus.Error {
  background-color: #f23b3b;
}

.SEOValidationFieldStatus.Ok {
  background-color: #48d660;
}

.SEOVAlidationFieldValue {
  overflow-wrap: break-word;
  width: 100%;
  font-size: 1rem;
  margin-top: 0.5rem;
  color: #4a5568;
}

Nice!我们成功编写了新 Tab 页模板、逻辑与样式,以及创建了 Content 脚本逻辑,最后我们的展示效果如下:

然后我们需要进行代码构建,因为 content 我们使用 TypeScript 语法写,将 content 的逻辑构建为单独的 JS 输出,我们安装 craco 依赖,然后修改对应的脚本:

yarn add -D craco
// package.json
"scripts": {
    "start": "react-scripts start",
    "build": "INLINE_RUNTIME_CHUNK=false craco build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },

react-scripts 改为 craco

然后新建 craco.config.js ,添加如下内容:

module.exports={
  webpack: {
    configure: (webpackConfig, { env, paths })=> {
      return {
        ...webpackConfig,
        entry: {
          main: [
            env==="development" &&
              require.resolve("react-dev-utils/webpackHotDevClient"),
            paths.appIndexJs,
          ].filter(Boolean),
          content: "./src/chromeServices/DOMEvaluator.ts",
        },
        output: {
          ...webpackConfig.output,
          filename: "static/js/[name].js",
        },
        optimization: {
          ...webpackConfig.optimization,
          runtimeChunk: false,
        },
      };
    },
  },
};

准备完毕,开始构建:yarn`` build ,我们会发现构建目录输出如下:

写在最后

在本篇文章中,我们完整体验了使用 React+TypeScript,开发新 Tab 内容展示页以及 content 通信脚本,然后通过配置 react-scripts 为 craco 进行了分文件构建,以及直接开发原生的 popup 页,通过这种融汇的技术,成功开发出了一个类似掘金框架的 Chrome 插件。

这篇文章没有介绍的有 background 脚本,以及整体插件内容还不够完善,希望有兴趣的读者可以继续探索,将其完善。

??/ 感谢支持 /

以上便是本次分享的全部内容,希望对你有所帮助^_^

喜欢的话别忘了 分享、点赞、收藏 三连哦~

欢迎关注公众号 程序员巴士,来自字节、虾皮、招银的三端兄弟,分享编程经验、技术干货与职业规划,助你少走弯路进大厂。

们应该都知道APP开发的技术模式最主流的有三种,分别是原生APP、WebAPP以及混合APP,其中WebAPP又可以被称作html5移动APP开发,建设一个网站会用到框架,那么,在开发APP的时候基于上面三种开发模式因为编程语言的不同也会有不同的框架,根据需求或者行业不同可以去使用不同的框架。

所以,济南文汇传媒的小编就根据基于开发的模式不同的编程语言说一说都有哪些不同的框架以及它们的特点。


专业APP开发技术/文汇传媒


一、VIPER框架

原生APP因为是在本地的操作系统Android和ios中使用原生的编码运行,ios使用Objective-C,Android使用Java,所以它的应用比较少,相对来说框架很重要。Android系统是依赖注入框架Dagger,ios系统最新的框架是VIPER。它们的特点是能够开发出用户体验度最高的应用,适用于比较复杂的应用。

二、Ionic框架

这里介绍一下最具优势的框架Ionic,Ionic是一个前端框架,所以该框架比较注重外观设计和体验以及应用程序的UI交互,它的特点是速度快、界面美观等,利用丰富的UI组件来开发APP应用。

三、PhoneGap框架

因为混合APP是结合了原生APP和WebAPP两者的优点,所以混合APP开发应用的框架的重点是WebAPP基础设施。它的框架是PhoneGap,采用CSS、HTML和JavaScript技术,利用PhoneGap可以为Android和ios操作系统生成API。它的特点是能够创建跨平台的APP应用程序、速度快,框架是开源的开发也比较方便。


专业APP开发技术/文汇传媒


四、appcan框架

appcan框架也是支持混合APP开发和运行的,同样是WebAPP为中心的框架,appcan框架比PhoneGap框架的优势是支持多窗口,在开发移动应用时会更灵活,可以开发比较大型的应用程序,它的代码可以加密,这样就不用担心安全问题。

好了,以上就是济南文汇传媒的小编根据APP开发技术模式不同总结的不同框架,如果您还知道其他的可以留言补充!

人对各大学习网站,且适合大学生浏览的网站进行了汇总和分类,分别为:课程,知识,学术必备,阅读,计算机,艺术,外语,纪录片(毕竟看纪录片是奠定世界观、塑造对美的认识的重要途径),共8大类

吐血整理,可以先点赞再看!

一、课程

1.网易公开课

中文公开课网站,不仅有国内众多公开课,TED、可汗学院等国外网站课程都有翻译。

网易公开课

2.爱课程网

中国大学精品开放课程的官方网站,提供2000多门教育部“国家级精品资源共享课”。

精品开放课程共享系统 - 爱课程 - 首页

3.中国教育在线开放资源平台

包括哈佛大学、耶鲁大学、斯坦福大学、复旦大学、浙江大学等国内外知名高校开放课程。

大学公开课 | 好课网 - 中国教育在线

4.学堂在线

免费公开的在线课程平台,有国内外一流名校开设的免费网络学习课程。

学堂在线-最大的中文慕课(MOOC)平台

5.网易云课堂

提供大量办公软件使用、电脑基础操作的免费课程,部分课程付费。

全部课程 - 网易云课堂

6.粉笔网

提供针对考研、公务员考试、教师招聘考试等课程,可关注全国各地知名老师并与其互动,下载原创的学习资料和题目。

粉笔网

7.多贝公开课

互联网、IT技术、网络营销等网络公开课课程集合,为求职打下基础。

发现课程 - 多贝公开课

8.MOOC学院

店铺课程,记录作业、资料和学习心得,相互探讨问题。可在课程列表中寻找自己感兴趣的课程。

MOOC学院(慕课)| 发现全球在线好课

9.Coursera

同世界顶尖大学合作,在线提供免费公开课程,并有中文版界面。

Coursera | Online Courses From Top Universities. Join for Free

10.edX

免费学习来自全球顶尖大学(包括哈佛、MIT)的课程,提供付费的认证证书。

edX

11.OpenYale Courses

提供耶鲁大学的课程,基于传统的网络公开课,也有MOOC。

Open Yale Courses

12.Harvard Extension School:Open Learning Initiative

哈佛大学的线上课程视频精选

Open Learning at Harvard

13.Iversity

欧洲领先的免费公开课教学网站,提供英文及德文课程。

MOOCs - All courses - iversity.org

14.MRUniversity

经济学科类在线教育网站,英文授课。

Marginal Revolution University

二、知识

1.中国科普博览

没有围墙的博物馆,中科院网络化科学传播平台。

中国科普博览--中国优秀文化网站、全国优秀科普网站

2.36氪

提供科技及新兴互联网公司信息、评论和分析。

36氪 | 让创业更简单

3.科学松鼠会

致力于在大众文化层面传播科学的网站,物理、化学、天文、环境等方面均有涉及。

科学松鼠会 :: 让我们剥开科学的坚果

4.丁香医生

提供医学健康内容与医疗健康服务的平台。

丁香医生 - 可信赖的医疗健康信息和服务

5.十万个为什么

在线版《十万个为什么》,青少年百科全书。

十万个为什么 - 在线青少年百科全书

6.一席

以现场演讲为特色,其网站上可以观看晚期演讲视频。

一席|人文.科技.白日梦

7.自然志

用影像和文字记录自然的科普网站

自然主义

8.世界数字图书馆

观赏来自世界各国图书馆的珍贵手稿、地图、建筑图、摄影等文化瑰宝。

世界数字图书馆主页

9.OpenStax College

免费的大学教科书数据库,可浏览外国教科书。

OpenStax

10.大桔灯(万成文库改版)

提供各类文档免费下载。

文库分享与免费下载 - 大桔灯

三、学术必备

1.中国知网

提供中国学术文献、外文文献、学位论文、年鉴等各类资源统一检索、统一导航、在线阅读和下载服务。

中国知网

2.读秀学术搜索与文献传递系统

收录230余万种中文图书题录信,实现深入到数章节和内容的全文检索。

系统登录

3.万方数据

中国学术论文、期刊、外文文献等学术资料一站检索,其中万方数据方志收集了1949年以后出版的中国地方志。

地方志-万方数据知识服务平台

4.超星网

网络书库,借助学校图书馆可以免费浏览各类读物和学术专著。

http://chaoxing.com

5.中国科学引文数据库

检索在国内期刊发表过的论文被引用情况。

中国科学文献服务系统

6.国家哲学社会科学学术期刊数据库

国家级哲学社会科学信息平台,在线阅读数百种期刊。

国家哲学社会科学学术期刊数据库

7.小木虫

学术科研互动社区,包括科研问答、论文投稿与基金申请经验等分享。

小木虫 - 学术 科研 互动社区

8.VIPExam

收录各领域考试的历年真题及模拟试卷,还可以进行计算机等级考试模拟。

中科VIPExam考试学习资源数据库

9.世界知识产权组织

查询国外专利文献。

Intellectual Property

10.Web of Science

科研资料库,一站式检索SCI文献,需要注册。

Please Sign In to Access Web of Science

四、阅读

1.鸠摩搜书

实用的电子书搜索平台。

Jiumo E-Book Search 鸠摩搜书

2.书格

提供古籍阅读的数字图书馆。

书格

3.读写人

一个聚合了书评杂志、书评博客、中英文读书资源的读书网站,书评爱好者不容错过。

读写人:书评杂志、书评博客、书评网站、读书资源聚合

4.每日一文

每天一篇精彩文章,让读书成为一种乐趣。

活着真好 维克多.科克留什金 | 每日一文

5.十五言

高质量的阅读和写作社区

十五言 - 每个人都在创造

6.读书马上

在线阅读平台,发现值得阅读的设计、思想、文学、科技类。

读书马上

7.龙源电子期刊阅览室

大型人文类期刊网上阅览室,与纸质版同步发行。

龙源期刊网-你喜欢的所有名刊大刊数字版都在这里了!

8.Factiva道琼斯新闻数据库

提供全球范围内最有价值的商业信息,需要注册。

http://global.factiva.com

五、计算机

1.51CTO

一个专注于综合IT技术领域的在线教育平台,需要注册,可学习多门语言。

51CTO学院 - IT人充电,上51CTO学院!

2.我要自学网

视频教学网站,学习电脑技术,设计网页设计、PS、AE等软件。

我要自学网-视频教程|免费教程|自学电脑|3D教程|平面教程|影视动画教程|办公教程|机械设计教程|网站设计教程-我要自学网

3.翼狐网

设计类学习网站,提供主流应用软件的教学以及插件工具资源下载。

翼狐网(翼虎网)-学设计,上翼狐!

4.W3school

网站建设教程,从基础的HTML到XHTML,到进阶的XML、SQL、多媒体和WAP。

w3school 在线教程

5.AppCan-HTML5

移动应用开发平台

AppCan开发培训_视频教程_在线视频

6.慕课网

IT技能学习平台,提供web前端、网页开发等从入门到进阶的系统课程。可以和同伴一起编程。

慕课网-程序员的梦工厂

7.Hack Design

全球顶级设计师教你网页、APP设计,免费。

Design lessons for everyone, curated by top designers

8.优达学诚(Udacity)

大量免费课程,适合专业编程学习者,提供微学位。

优达学城 (Udacity) - 传授硅谷的名企官方课程

9.中国统计网

提供数据分析软件学习资料和行业资讯。

数据分析与数据挖掘从这开始

10.InfoQ

在线新闻/社区网站,促进软件开发领域知识与创新的传播,为软甲开发者提供帮助。

InfoQ - 促进软件开发领域知识与创新的传播

11.掘金

高质量的技术分享社区

https://gold.xitu.io

六、艺术

1.好戏网

提供城市文艺资讯,涉及话剧、舞蹈、展览等方面。

创造 ? 汇聚 ? 分享 ? 文艺生活指南

2.豆瓣电影

提供最新的电影介绍和影评、评分。

豆瓣电影

3.Gallerix在线绘画艺术图库

收录16 万余幅世界名家的画作,堪称在线的美术作品博物馆。

绘画、 艺术家、 图片。

4.肉丁网

手工DIY资料学习网站。

DIY创意生活|手工制作╭★肉丁网

5.Justin Guitar

免费的吉他课程。

THE BEST GUITAR TUTORIALS FREE!! Justin Guitar | Free Guitar Lessons With Justinguitar.com

6.落网

推荐国内外独立音乐的网站。

落网 - 独立音乐推荐

7.TOPYS

创意分享网站,欣赏优秀的广告设计。

全球顶尖创意分享平台 OPEN YOUR MIND

8.蜂鸟网

摄影爱好者分享摄影技巧和作品的网站。

蜂鸟网 - 中国专业影像门户,摄影爱好者分享摄影技巧和作品的网站

七、外语

1.译言网

开放的社区翻译平台,可以提交发现的精彩外文内容、翻译原文库的位置。

译言古登堡计划

2.沪江英语学习网

英语学习资讯网站,英语学习平台。

沪江英语-沪江旗下英语学习资讯网站_免费英语学习网站

3.普特英语听力

实用英语听力训练社区

普特英语听力-著名英语学习网站-掌握英语,从听开始!

4.魔方英语

看电影学习英语的网站,提高口语和听力。

首页 - 魔方英语 - 英语学习软件-看电影学英语-英语魔方秀-魔方英语

5.小语种口语网

提供小语种口语练习的网站

小语种口语网官方网站(tukkk.com)|小语种学习网站|小语种学习|小语种自学

6.声同小语种

小语种学习论坛,分享泰语、西班牙语、法语、阿拉伯语等小语种学习经验。

声同小语种论坛 - 声同此声,心同此心! - Powered by phpwind

7.Lang-8

免费学习多种语言的网站,用户可以上传自己写的外语短文,母语者将会帮助你修改。

Multi-lingual language learning and language exchange Lang-8

8.口语伙伴

含公共英语、国外就学、求职面试、社交英语、生活英语等模块口语训练。

首页- 口语伙伴-公共馆高校馆专属网站

9.多邻国

免费的外语学习网站,目前向中文使用者提供英语、西班牙语课程。

学习语言,永远免费

10.B站也是个神奇的学外语的地方

英语,日语,韩语,法语,德语,俄语,西班牙语,葡萄牙语,意大利语都有

码字累死小编了,各位点个赞再走可好?