Discourse-webpack:一个用于开发重度 JS 的 Discourse 组件的样板文件

@david 编辑:Discourse 的主题系统现已内置对 多个 JS 文件 的支持。此 webpack 方法不再需要。


大家好!在我 开发 handsfree-discourse 组件 时,遇到了一些文件管理方面的问题。我的主要问题是需要一种方法将代码拆分到多个文件中。另一个问题是我需要包含第三方库,而无需要求管理员启用 CORS 或触发额外的 HTTP 请求。

为了解决这些问题,我创建了 discourse-webpack,这是一个用于快速搭建重度 JS 组件的样板项目!其功能包括:

  • 支持实时重载的本地开发服务器
  • 包含一个提交脚本,可将源代码和编译后的代码保留在不同的分支中!

本主题其余部分将解释如何使用它以及其工作原理。我刚刚为正在开发的几个其他组件完成了测试,所以如果您遇到任何问题或有具体需求,请告诉我!


Discourse Webpack

快速为您的 Discourse 社区搭建重度 JavaScript 组件,并附带提交脚本,将源代码和构建代码保留在不同的分支中,助您保持 快速 交付!


安装

首先,确保您的本地机器上已安装 NodeJS >= 8git。然后,依次输入以下各行:

# 下载此仓库
git clone https://github.com/browsehandsfree/discourse-webpack

# 进入目录
cd discourse-webpack

# 安装依赖
npm install

接下来,您需要在 package.json 中编辑以下内容,将所有链接替换为您自己的。具体包括:

{
  name: 'your-project',
  repository: {
    url: 'git+https://github.com/username/repo'
  },
  author: '',
  bugs: {
    url: 'https://github.com/username/repo/issues'
  },
  homepage: 'https://example.com'
}

最重要的是,确保 repository.url 正确无误,并以 git+ 开头。当您运行 npm run discourse 时,它会将更改提交并推送到该仓库。

另外,别忘了 设置您的 Discourse 的 about.json,它位于 /src/discourse/about.json


开发

运行 npm install 后,您将得到以下目录结构:

discourse-webpack
|- node_modules/        # 依赖项
|- src/                 # 主要源文件
|--|- discourse/        # Discourse 主题文件
|--|--|- common/
|--|--|- desktop/
|--|--|- mobile/
|--|- main.css          # 主样式表
|--|- main.js           # 主 JavaScript 入口
|--|- sandbox.html      # 本地开发沙盒
|- .gitignore
|- discourse-push.js    # 特殊提交脚本
|- README.md
|- webpack.config.js    # Webpack 配置
|- yarn.lock

命令行脚本

此外,您可以在项目根目录下使用以下命令:

# 在 localhost:8080 启动开发服务器
# - 支持实时重载
# - 使用 `/src/sandbox.html` 帮助您在本地调试
npm run dev

# 将组件编译到 `/dist`
npm run build

# 将组件编译到 `/dist`
# - 然后将 `/dist` 提交到 `discourse` 分支
npm run discourse

工作原理

下载仓库并安装依赖项后,就可以开始开发了!使用 npm run devlocalhost:8080 启动一个支持实时重载的服务器。

访问该 URL 将加载位于 /src/sandbox.html 的 HTML 文件。该文件实际上并未在 Discourse 中使用,仅用于帮助您在本地(Discourse 上下文之外)开发脚本。

主要的 webpack 入口点是 /src/main.js。从那里,您可以 import 其他脚本,webpack 会将所有内容打包在一起,并注入到以下文件中:

  • /src/sandbox.html
  • /src/discourse/common/body_tag.html

main.js 会自动编译并注入到 sandbox.html 中,但由于以下代码,它需要手动内联注入到 body_tag.html 中:

<script>
  <%= compilation.assets['main.js'].source() %>
</script>

如果您想将脚本注入到另一个模板(如 after_header.html),只需将该 script 标签复制到该模板中即可。这样,您可以在开发时将 HTML 和 JavaScript 分离,但在部署时又能将它们合并在一起!


编译

当您使用 npm run build 进行编译时,会发生以下情况:

  • 首先,/src/main.js 及其依赖项会被打包
  • 然后,/src/discourse/ 中的所有文件都会被复制到 /dist/
  • 同时,main.js 会被 内联 注入到任何包含以下代码的模板文件中:
<script>
  <%= compilation.assets['main.js'].source() %>
</script>

部署

当您运行 npm run discourse 时,将调用 /discourse-push.js 脚本并执行以下操作:

  • 首先,它会像运行 npm run build 一样进行编译
  • 然后,它会在 /dist 内初始化一个新的 git 仓库
  • 接着,它将 /dist 提交到您项目的 discourse 分支(如果该分支不存在,则会创建它)

使用 discourse 分支

以下每个 /relative/urls/ 均相对于您的论坛基础 URL,例如:https://example.com/relative/urls/

安装组件

通过访问 /admin/customize/themes 并选择“从网络导入”,从您的项目仓库(例如:https://github.com/my-awesome/discourse-component)安装组件。

然后将分支设置为 discourse。如果保留为 master,它将无法工作,因为 Discourse 会尝试加载未编译的文件(如果它能运行的话)。


在您自己的主机上调试特定主题文件

如果您是 Discourse 的新手并希望分叉此项目,以下文章可能会有所帮助。

16 个赞

Discourse now has native support for “JS heavy” theme components

@labofoz I would be interested to know whether you think this is enough to avoid the need for discourse-webpack?

6 个赞