前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Chrome Extension in CLJS —— 搭建开发环境

Chrome Extension in CLJS —— 搭建开发环境

作者头像
^_^肥仔John
发布于 2018-07-11 06:24:30
发布于 2018-07-11 06:24:30
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

前言

 磨刀不误砍柴工,本篇将介绍如何搭建Chrome插件的ClojureScript开发环境。 具体工具栈:vim(paredit,tslime,vim-clojure-static,vim-fireplace) + leiningen(lein-cljsbuild,lein-doo,lein-ancient) + com.cemerick/piggieback

写得要爽

 首先抛开将cljs编译为js、调试、测试和发布等问题,首先第一要务是写得爽~  cljs中最让人心烦的就是括号(),过去我想能否改个语法以换行来代替括号呢?而paredit.vim正好解决这个问题。

安装

在.vimrc中添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Plugin 'paredit.vim'

在vim中运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
:source %
:PluginInstall

设置<Leader>

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
" 设置<Leader>let mapleader=','
let g:mapleader=','

用法

  1. 输入([{",会自动生成)]}",并且光标位于其中,vim处于insert状态;
  2. normal模式时,输入<Leader>+W会生成括号包裹住当前光标所在的表达式;
  3. normal模式时,输入<Leader>+w+[会生成[]包裹住当前光标所在的表达式;
  4. normal模式时,输入<Leader>+w+"会生成""包裹住当前光标所在的表达式。

更多用法就通过:help paredit查看paredit的文档即可。

编译环境

 cljs要被编译为js后才能被运行,这里我采用leiningen。 在shell中运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建工程
$ lein new crx-demo
$ cd crx-demo

工程目录中的project.clj就是工程文件,我们将其修改如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defproject crx-demo "0.1.0-SNAPSHOT"
  :description "crx-demo"
  :urnl "http://fsjohnhuang.cnblogs.com"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.8.0"]               ;; 通过dependencies声明项目依赖项
                 [org.clojure/clojurescript "1.9.908"]]
  :plugins [[lein-cljsbuild "1.1.7"]]                        ;; 通过plugins声明leiningen的插件,然后就可以通过lein cljsbuild调用lein-cljsbuild这个插件了
  :jvm-opts ["-Xmx1g"]                                        ;; 设置JVM的堆容量,有时编译失败是应为堆太小
  :cljsbuild {:builds
              [{:id "browser_action"
                :source-paths ["src/browser_action"]
                :compiler {:main browser-action.core
                           :output-to "resources/public/browser_action/js/ignoreme.js"
                           :output-dir "resources/public/browser_action/js/out"
                           :asset-path "browser_action/js/out"
                           :optimizations :none              ;; 注意:为提高编译效率,必须将优化项设置为:none
                           :source-map true
                           :source-map-timestamp true}}
               {:id "content_scripts"
                :source-paths ["src/content_scripts"]
                :compiler {:main content-scripts.core
                           :output-to "resources/public/content_scripts/js/content_scripts.js"
                           :output-dir "resources/public/content_scripts/js/out"
                           :asset-path "content_scripts/js/out"
                           :optimizations :whitespace
                           :source-map true
                           :source-map-timestamp true}}}]}
  :aliases {"build" ["cljsbuild" "auto" "browser_action" "content_scripts"] ;; 设置别名,那么通过lein build就可一次性编译browser_action和content_scripts两个子项目了。
  })

 上述配置很明显我是将browser_action和content_scripts作为两个独立的子项目,其实Chrome插件中Browser ActionPage ActionContent ScriptsBackground等均是相对独立的模块相互并不依存,并且它们运行的方式和环境不尽相同,因此将它们作为独立子项目配置、编译和优化更适合。   然后新建resources/public/img目录,并附上名为icon.jpg的图标即可。 &esmp;然后在resources/public下新建manifest.json文件,修改内容如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "manifest_version": 2,
  "name": "crx-demo",
  "version": "1.0.0",
  "description": "crx-demo",
  "icons":
  {
    "16": "img/icon.jpg",
    "48": "img/icon.jpg",
    "128": "img/icon.jpg"
  },
  "browser_action":
  {
    "default_icon": "img/icon.jpg",
    "default_title": "crx-demo",
    "default_popup": "browser_action.html"
  },
  "content_scripts":
  [
        {
            "matches": ["*://*/*"],
            "js": ["content_scripts/js/core.js"],
            "run_at": "document_start"
        }
  ],
  "permissions": ["tabs", "storage"]
}

 接下来新建resources/public/browser_action.html,并修改内容如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <script src="browser_action/js/out/goog/base.js"></script>
  <script src="browser_action/js/out/goog/deps.js"></script>
  <script src="browser_action/js/out/cljs_deps.js"></script>
  <script src="browser_action.js"></script>
</body>
</html>

 到这一步我们会发现哪来的browser_action.js啊?先别焦急,这里涉及到Browser Action的运行环境与google closure compiler输出不兼容的问题。

Browser Action/Popup运行环境

 这里有个限制,就是default_popup所指向页面中不能存在内联脚本,而optimizations :none时google closure compiler会输出如下东东到ignoreme.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var CLOSURE_UNCOMPILED_DEFINES = {};
var CLOSURE_NO_DEPS = true;
if(typeof goog == "undefined") document.write('<script src="resources/public/browser_action/js/out/goog/base.js"></script>');
document.write('<script src="resources/public/browser_action/js/out/goog/deps.js"></script>');
document.write('<script src="resources/public/browser_action/js/out/cljs_deps.js"></script>');
document.write('<script>if (typeof goog == "undefined") console.warn("ClojureScript could not load :main, did you forget to specify :asset-path?");</script>');
document.write('<script>goog.require("process.env");</script>');
document.write('<script>goog.require("crx_demo.core");</script>');

这很明显就是加入内联脚本嘛~~~所以我们要手工修改一下,新增一个resources/public/browser_action.js,然后添加如下内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
goog.require("process.env")
goog.require("crx_demo.core")

这里我们就搞定Browser Action/Popup的编译运行环境了^_^。大家有没有发现goog.require("crx_demo.core")这一句呢?我们的命名空间名称不是crx-demo.core吗?注意了,编译后不仅路径上-会变成_,连在goog中声明的命名空间名称也会将-变成了_

Content Scripts运行环境

 由于content scripts是直接运行脚本,没有页面让我们如popup那样控制脚本加载方式和顺序,因此只能通过optimizations :whitespace将所有依赖打包成一个js文件了。也就是说编译起来会相对慢很多~很多~多~~~

开发得爽

 到这里我们似乎可写上一小段cljs,然后编译运行了。且慢,没有任何智能提示就算了,还时不时要上网查阅API DOC,你确定要这样开发下去?

在vim中查看API DOC

 通过vim-fireplace我们可以手不离vim,查阅API文档,和查阅项目代码定义哦! 1.装vim插件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Plugin 'tpope/vim-fireplace'

在vim中运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
:source %
:PluginInstall

2.安装nRepl中间件piggieback  nRepl就是网络repl,可以接收客户端的脚本,然后将运行结果回显到客户端。我们可以通过lein repl启动Clojure的nRepl。  而fireplace则是集成到vim上连接nRepl的客户端,但默认启动的仅仅是Clojure的nRepl,所以要通过中间件附加cljs的nRepl。这是我们只需在project.clj中添加依赖即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
:dependencies [[com.cemerick/piggieback "0.2.2"]]
:repl-options {:port 9000
               :nrepl-middleware [cemerick.piggieback/wrap-cljs-repl]}

 在shell中更新依赖lein deps 3.设置fireplace监听端口  在项目目录下创建文件,echo 9000 > .nreplport 4.启动nRepl,lein repl  这时在vim中输入:Source map就会看到cljs.core/map的定义,若不行则按如下设置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
:Connect
Protocol: nrepl
Host: localhost
Port: 9000
Scope connection to: ~/crx-dome

这样就设置好fireplace和nrepl间的链接了。 5.别开心太早  不知道是什么原因我们只能用fireplace中部分的功能而已,如通过:Source <symbol>查看定义,:FindDoc <keyword>查看匹配的Docstring,但无法通过:Doc <symbol>来查看某标识的Docstring。  另外若要通过:Source <symbol>查看当前项目的定义时,请先lein build将项目编译好,否则无法查看。另外一个十分重要的信息是,在optimizations不为:none的项目下的文件是无法执行fireplace的指令的,所以在开发Content Scrpts时就十分痛苦了~~~

 那有什么其他办法呢?不怕有tslime.vim帮我们啊!

tslime.vim

 tslime.vim让我们可以通过快捷键将vim中内容快速地复制到repl中执行 1.安装vim插件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Plugin 'jgdavey/tslime.vim'

在vim中运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
:source %
:PluginInstall

2..vimrc配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
" 设置复制的内容自动粘贴到tmux的当前session和当前window中
let g:tslime_always_current_session = 1 let g:tslime_always_current_window = 1

vmap <C-c><C-c> <Plug>SendSelectionToTmux
nmap <C-c><C-c> <Plug>NormalModeSendToTmux
nmap <C-c>r <Plug>SetTmuxVars

3.将clojure repl升级cljs repl  通过lein repl我们建立了一个cljs nrepl供fireplace使用,但在终端中我们看到的是一个clojure的repl,而tslime恰好要用的就是这个终端的repl。那现在我们只要在clojure repl中执行(cemerick.piggieback/cljs-repl (cljs.repl.rhino/repl-env))即可。 然后就可以在vim中把光标移动到相应的表达式上按<C-c><C-c>,那么这个表达式就会自动复制粘贴到repl中执行了。

美化输出

 由于cljs拥有比js更为丰富的数据类型,也就是说直接将他们输出到浏览器的console中时,显示的格式会不太清晰。于是我们需要为浏览器安装插件,但通过devtools我们就不用显式为浏览器安装插件也能达到效果(太神奇了!) 在project.clj中加入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
:dependencies [[binaryage/devtools "0.9.4"]]
;; 在要格式化输出的compiler中添加
:compiler {:preloads [devtools.preload]
           :external-config {:devtools/config {:features-to-install [:formatters :hints :async]}}}

然后在代码中通过js/console.logjs/console.info等输出的内容就会被格式化的了。

单元测试很重要

 为了保证开发的质量,单元测试怎么能少呢?在project.clj中加入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
:plugins [[lein-doo "0.1.7"]]

然后在test/crx_demo下新建一个runner.cljs文件,并写入如下内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(ns crx-demo.runner
  (:require-macros [doo.runners :refer [doo-tests]])
  (:require [crx-demo.content-scripts.util-test]))

;; 假设我们要对crx-demo.content-scripts.util下的函数作单元测试,而测试用例则写在crx-demo.content-scripts.util-test中
(doo-tests 'crx-demo.content-scripts.util-test)

然后创建crx-demo.content-scripts.util-test.cljs测试用例文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(ns crx-demo.content-scripts.util-test
  (:require-macros [cljs.test :refer [deftest is are testing async]]
  (:require [crx-demo.content-scripts.util :as u]))

(deftest test-all-upper-case?
  (testing "all-upper-case?"
    (are [x] (true? x)
      (u/all-upper-case? "abCd")
      (u/all-upper-case? "ABCD"))))

(deftest test-all-lower-case?
  (testing "all-lower-case?"
    (is (true? (u/all-lower-case? "cinG")))))

(deftest test-get-async
  (async done
    (u/get-async (fn [item]
                   (is (seq item))
                   (done)))))

然后再新增一个测试用的子项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{:id "test-proj"
 :source-paths ["src/content_scripts" "test/crx_demo"]
 :compiler {:target :nodejs                   ;;运行目标环境是nodejs
            :main crx-demo.runner
            :output-to "out/test.js"
            :output-dir "out/out"
            :optimizations :none
            :source-map true
            :source-map-timestamp true}}

然后在shell中输入lein doo node test-proj

发布前引入externs

 辛苦开发后我们将optimizations设置为advanced后编译优化,将作品发布时发现类似于如下的报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Uncaught TypeError: sa.B is not a function

这究竟是什么回事呢? 开发时最多就是将optimizations设置为simple,这时标识符并没有被压缩,所以如chrome.runtime.onMessage.addListener等外部定义标识符依然是原装的。但启用advanced编译模式后,由于上述外部标识符的定义并不纳入GCC的编译范围,因此GCC仅仅将调用部分代码压缩了,而定义部分还是原封不动,那么在运行时调用中自然而然就找不到相应的定义咯。Cljs早已为我们找到了解决办法,那就是添加extern文件,extern文件中描述外部函数、变量等声明,那么GCC根据extern中的声明将不对调用代码中同签名的标识符作压缩。 示例:chrome的extern文件chrome.js片段

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @constructor
 */
function MessageSender(){}
/** @type {!Tab|undefined} */
MessageSender.prototype.tab

配置

1.访问https://github.com/google/closure-compiler/tree/master/contrib/externs,将chrome.js和chrome_extensions.js下载到项目中的externs目录下 2.配置project.clj文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
:compiler {:externs ["externs/chrome.js" "externs/chrome_extensions.js"]}

总结

最后得到的project.clj为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defproject crx-demo "0.1.0-SNAPSHOT"
  :description "crx-demo"
  :urnl "http://fsjohnhuang.cnblogs.com"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.8.0"]
                 [org.clojure/clojurescript "1.9.908"]
                 [binaryage/devtools "0.9.4"]
                 [com.cemerick/piggieback "0.2.2"]]
  :plugins [[lein-cljsbuild "1.1.7"]
            [lein-doo "0.1.7"]
            [lein-ancient "0.6.12"]] ;; 通过`lein ancient upgrade``lein ancient upgrade:plugins`更新依赖项
  :clean-targets ^{:protect false} [:target-path "out" "resources/public/background" "resources/public/content_scripts" "resources/public/browser_action"]
  :jvm-opts ["-Xmx1g"]
  :repl-options {:port 9000
                 :nrepl-middleware [cemerick.piggieback/wrap-cljs-repl]}
  :cljsbuild {:builds
              [{:id "browser_action"
                :source-paths ["src/browser_action"]
                :compiler {:main browser-action.core
                           :output-to "resources/public/browser_action/js/ignoreme.js"
                           :output-dir "resources/public/browser_action/js/out"
                           :asset-path "browser_action/js/out"
                           :optimizations :none
                           :source-map true
                           :source-map-timestamp true
                           :externs ["externs/chrome.js" "externs/chrome_extensions.js"]
                           :preloads [devtools.preload]
                           :external-config {:devtools/config {:features-to-install [:formatters :hints :async]}}}}
               {:id "content_scripts"
                :source-paths ["src/content_scripts"]
                :compiler {:main content-scripts.core
                           :output-to "resources/public/content_scripts/js/content_scripts.js"
                           :output-dir "resources/public/content_scripts/js/out"
                           :asset-path "content_scripts/js/out"
                           :optimizations :whitespace
                           :source-map true
                           :source-map-timestamp true
                           :externs ["externs/chrome.js" "externs/chrome_extensions.js"]
                           :preloads [devtools.preload]
                           :external-config {:devtools/config {:features-to-install [:formatters :hints :async]}}}}]}
  :aliases {"build" ["cljsbuild" "auto" "browser_action" "content_scripts"]
            "test"  ["doo" "node" "test-proj"]})

随着对cljs的应用的深入,我会逐步完善上述配置^_^ 尊重原创,转载请注明来自^_^肥仔John

参考

http://astashov.github.io/blog/2014/07/30/perfect-clojurescript-development-environment-with-vim/ https://github.com/emezeske/lein-cljsbuild https://nvbn.github.io/2014/12/07/chrome-extension-clojurescript/ https://github.com/binaryage/cljs-devtools/blob/master/docs/configuration.md https://clojurescript.org/tools/testing https://github.com/google/closure-compiler/wiki/Externs-For-Common-Libraries

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-10-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
ERP vs MRP,傻傻分不清楚?
ERP和MRP听起来非常相似,以至于许多人认为它们是出于相同的原因而使用的系统。然而,这两个系统却有不同的目的。下面,让我们仔细看看制造业中的这两个系统。
人称T客
2019/05/08
1.4K0
ERP vs MRP,傻傻分不清楚?
企业用户ERP选型还需“门当户对”,必看 50 谏言!
T客汇官网:tikehui.com 译者 |杨丽 选择一款合适的 ERP 软件并非易事。 首先,ERP 系统的概念不断扩大,涉及的领域也在逐渐扩张。企业选购一款合适的 ERP 系统需要 RFI(信息邀
人称T客
2018/03/26
9650
企业用户ERP选型还需“门当户对”,必看 50 谏言!
CIO要谨防销售忽悠 选择ERP供应商如何才能做到万无一失?
ERP系统可以在管理内外部资源,保持业务平稳运营上提供很大帮助,ERP平台还可能是累赘,让CIO为难是否应该付出必须的资金和工作。本指南将介绍如何克服ERP实施障碍,平衡增长的可见度和效率。本指南还包含了厂商选择、预算等ERP信息。 ERP评估 对ERP产品的初期了解可以通过众多供应商开展,明智地选择ERP供应商和产品非常重要。制定可行的项目时间计划、预算和期望值,并与潜在供应商密切接触。紧密地合作可以建立更稳固的关系以实现双赢。下面让我们来分析如何能够平衡两者之间的关系并选择适合自身需要的供应商和ER
人称T客
2018/03/19
8960
ERP和MES的区别与联系,这篇接地气的文章终于讲明白了!
作为一个工厂,存在的目的只有两个,生产产品,然后卖出去。所以在工业企业中,通常会分为两个大的部门,一个是生产部门,一个是业务部门,前者通过MES(制造执行系统)管理,后者通过ERP(管理信息系统)来管理。
informat低代码
2023/12/07
9.6K0
浅谈ERP数据的重要性
影响一个ERP项目的因素有很多,数据无疑是其中很重要的一项,正所谓“正确的诊断源于准确的信息,准确的信息基于可靠的采集”,当我们抓住数据这个根基,大处着眼,小处着手的时候,我们距离ERP成功的日子就不会太远。
matinal
2023/10/12
2630
ERP系统上线成功与失败是否存在判断标准?
导读:各个企业的目的目标不同,成功的标准也可能不同。但是,其中还是有一些共性的评价参数,参考平衡记分法的精神,归纳为四类。
齐天大圣
2021/06/15
1K0
ERP系统上线成功与失败是否存在判断标准?
2025 SAP ERP上云的十大优势
ERP云系统的优势很多,且因企业而异。例如,专业服务企业选择 ERP系统的理由会与制造企业大相径庭。
SNP数据迁移
2025/01/20
1371
2025 SAP ERP上云的十大优势
如何一步步实施ERP规划?
导读:近年来,随着ERP在市场的广泛实施,可见到有些企业实施信息化管理不顺畅和不理想的案例,其中有不少企业实施困难多的直接原因是缺乏整体和全面的实施规划。
齐天大圣
2021/06/17
5970
如何一步步实施ERP规划?
ERP系统的效益评估与应用价值
1 引言 如何获取ERP的企业价值是ERP实施应用的核心问题,传统的实践和研究活动主要关注ERP的实施过程,然而持续改进确是获取企业价值的ERP生命周期的“长尾”。克里斯安德森在其《长尾理论》一书中揭示了传统需求曲线中过去常常被忽视的那条无穷长的尾巴所带来的巨大财富,而这一理论也同样适用于ERP领域。所有ERP系统实施方法论的最后一个阶段都是一个长长的尾巴,称为“持续改进”,并且被认为是企业获取价值的根本保障。 然而,由于ERP项目的阶段性特征,ERP实施顾问通常在系统上线之后就结束实施项目,将“持续改进”留给企业客户,而企业用户在该领域知识匮乏,因此往往使持续改进这个“长尾”被人所忽视。当人们质疑ERP企业价值的时候,“没有进行持续改进”常常成为一个不需要负责任的借口。ERP持续改进是一个伴随ERP应用的长期过程,因此本文认为ERP持续改进需要与ERP实施有一个明显的阶段划分,对于多数企业来讲,实施项目的结束,仅仅完成了企业管理重塑的80%,这80%更多的是ERP系统的共性特征,而真正体现和强化企业竞争优势的部分是在共性特征上的个性特征的塑造,虽然只有20%,但确实企业价值创造的“长尾”。 由于ERP持续改进的长期性和个性化特征,这就使得这一过程更难于管理和操作,方法之一就是设定阶段性的效益目标和持续改进的关键活动。很多学者就ERP冲效益问题进行了研究,从管理和经济角度,提出了许多定性、定量的评估方法,多数ERP效益评估重点关注ERP的投资回报,更关注外在的结果;王惠芬提出ERP系统实施应用过程中的企业管理模式趋同理论,使得ERP效益评估进一步关注企业内部,其著作中提出的“成熟度模型”强化了过程思想。然而,该理论中仍将研究重点放在实施过程,并且企业管理模式的辨识的可操作性不强。 与传统信息系统相比,ERP具有更高的战略地位,不仅提供基本的信息工具,而且在企业范围内建立起新的管理模式,逐步成为数字企业的核心。因此,面向持续改进的ERP效益评估,不仅要突出ERP的阶段性效益,更要反映出企业在管理模式变化,在重塑企业DNA过程中所发生的变化,能够具有较强的阶段对比性,以及良好的方向导向性。 2 持续改进的特点 本文在分析了国内大量有关ERP持续改进的文献后,认为目前国内的ERP持续改进工作具有以下三个特点: 2.1 持续改进的反复性 ERP的持续改进是一个长期的过程,需要不断的进行分析、修正。针对模块的应用首先要做两项工作:一方面要使已经上线的模块能够更平稳的运行,扩大企业效益;另一方面是对系统已有但尚未应用的功能进行深度的应用。因为ERP是一个非常庞大的系统,上线部分其实只是基本功能的基本应用,相对于系统本身具备的全部功能还差得很远。同时还有一些业务不能直接满足,可能需要做一些开发。对功能深入应用主要分为四个步骤:首先要综合系统的功能,对已经在系统或者没有在系统中运行的流程进行分析:其次分析两者之间的运行差异,找到系统功能可以增强的点;再次,综合系统功能设计新方案;最后,调整运行方式并实施。 2.2 持续改进是对管理的不断提升 ERP实施的主要目的是系统通过先进的管理思想规范企业流程,使企业获得效益。所以如何评估ERP的效益,成为持续改进的一个重要课题。在ERP解决方案中对企业的愿景进行了描述,而企业的高层应该定期以此为标准,对整套ERP系统进行评估,确保系统的总体运行与系统运行的目标相一致。持续改进是对管理提升的支撑,随着企业环境的变化必然会导致业务的变化,同时企业对管理的认识也在不断的深入,诸多因素导致企业不可避免地要进行组织、流程等方面的调整,相应的,系统要能支撑这样的变化。管理提升与系统应用是相辅相成的关系,系统应用的深化同样可以促使管理水平的提升。比如系统里的平衡计分卡功能,要求企业的绩效体系有非常高的水平,这是一个管理与IT应用相互交融不断循环的过程。 2.3 持续改进是技术和业务趋同的过程 持续改进的过程应该是一个保持系统与业务需要相匹配的过程。企业高层应该认识到,ERP项目组不单单是一个项目小组,同时也是一个企业业务运作小组。它的作用不仅仅是维护系统本身的问题,更重要的是要关注系统是否能够很好的满足不断变化的业务需求,并同时提出业务流程优化和改进的建议。一般来说,ERP项目小组由企业各业务部门骨干和信息技术部门的人员组成,在项目实施的过程中,无论是来自业务部门的成员还是来自信息技术部门的成员,都对企业的业务和系统有了新的认识,并且最清楚如何使系统和业务更好地融合在一起。所以,这批ERP冲项目小组的骨干成员都需要保留下来,只有他们才能在持续改进的过程中更好地使系统支持业务的发展。同时企业内部的信息主管在ERP项目完成之后应该重新考虑信息
matinal
2020/11/27
1.4K0
如何开发全球一流的云迁移战略
云计算解决方案提供商提供了更多的选择,这些选择使企业可以选择一条最能满足其战略需求和风险状况的路径。但是,确定正确的路径要求企业在考虑所有备选方案之前先做好功课,以确保找到最符合商业目标的战略。
静一
2020/07/14
3550
CRM/PLM/SCM/MES与ERP的联系与区别
企业通过专设信息机构、信息主管,配备适应现代企业管理运营要求的自动化、智能化、高技术硬件、软件、设备、设施,建立包括网络、数据库和各类信息管理系统在内的工作平台,提高企业经营管理效率的发展模式。那么,在企业信息化建设中所用到的技术CRM、PLM、SCM、MES与ERP这些概念之间又有什么联系与区别呢?
用户5495712
2019/10/31
2.4K0
如何选择适合企业的仓库管理系统:ERP或WMS系统?
WMS系统主要用于管理库存的存储和移动,跟踪每个库存项目的移动,例如接收、拣选、包装和运输的项目。WMS系统基于实时信息提供库存优化,可以根据历史趋势和数据生成信息,以显示要放置的每个项目的最佳位置。WMS通常是独立系统,需要其他模块,例如会计和客户关系管理。
云坞网络-Peter
2023/06/12
3380
如何选择适合企业的仓库管理系统:ERP或WMS系统?
先有ERP,再谈中台、BI、低代码
随着IT技术发展,与传统企业的运营改革,越来越多的企业开始借助IT系统工具提升管理能力,但是方向却不太正确。
科控物联
2023/12/11
3120
先有ERP,再谈中台、BI、低代码
如何保证ERP系统在上线后运营稳定?
  大家以为从此以后可以松口气,但事实恰恰相反。原来攻坚战组成的组员陆续回到原来的部门,ERP项目组只剩下IT部门的人,“攻坚战”的胜利很快遭到了质疑。因为新系统大家还没用熟,在细节上总出现一些问题,大家对新系统的埋怨也开始越来越多。ERP上线后,失去了最初的赞扬和掌声,反而面临了很多困难与痛苦,那么如何克服这些困难?有什么良药能医治ERP上线后的困扰呢?
用户5495712
2019/11/21
9310
CIO必读:用友U8、金蝶K/3、易飞三款ERP产品优劣分析比
一、用友U8   用友U8,在用友多年财务软件的开发经验的基础上,以财务管理为企业的目标核心,以业务管理为企业的行为核心,突破了平行思考的串行的价值链结构,提出了基于立体价值链结构的产品体系部署原理,适应了中国企业在不同发展阶段对于企业管理需求的不同特点。包括了单一企业模式、具有分支机构的单一企业模式、产业型和投资型的企业集团及连锁经营模式等。   1、界面   该软件秉承了原有的财务管理软件的版面风格,整体界面比较实用,但是比较简单。   2、功能   用友ERP-U8 财务管理,包括了财务会计
人称T客
2018/03/19
3.6K0
企业管理软件ERP为什么要上云?
在网上搜索“ERP”或“企业资源计划”时,各种信息铺天盖地——别提有多困惑了。每个网站对ERP好像都有自己的定义,每个ERP实施都不尽相同。虽说定义众多,但基本都强调了ERP系统的灵活性,正是这一点使其成为了一款强大的企业管理工具。
用户5495712
2020/06/10
2.1K0
ERP软件是否包括人力资源软件
企业使用企业资源计划(ERP)软件来集成和管理涉及信息技术,服务和人力资源的常见任务。ERP主要是为大型企业设计的,具有支持广泛管理系统所需的资源,ERP分为针对公司特定区域的模块。人力资源(HR)管理是用于自动化管理工作的一个基本模块,否则这些工作将是乏味且耗时的。
深圳ERP
2019/12/12
7610
ERP软件是否包括人力资源软件
​BPM和ERP、OA的区别关系
经常听到ERP、BPM、OA这些词,企业在ERP、BPM上个先上哪个后上方面也有很多讨论,今天简单整理一篇他们三者的关系说明 ,希望对大家理解和使用它们有帮助。 一:ERP与BPM ERP与BPM:ERP(Enterprise Resource Planning,企业资源计划),以MRP(物料资源计划)、MRPII为核心,其管理思想一般围绕供应链、生产制造和财务为核心。而BPM从提升企业整体业务绩效、降低反馈周期和适应变化调整为目标,以流程为导向焦聚客户体验和核心价值。首先在实施范围上,ERP以企业的业务
程序源代码
2018/03/09
2.3K0
​BPM和ERP、OA的区别关系
BPM与ERP软件的区别
即使您不了解ERP和BPM之间的所有差异,您也可能知道它们有一个共同的目标,即提高生产率和增加利润。尽管有这种共性,但它们不是可互换的系统。根据您的特定业务目标和功能需求为组织选择正确的软件至关重要。如果选择不正确,可能会浪费时间和金钱。软件选择可能很复杂并且很耗时,但是如果正确完成,将会带来很多积极的好处。
深圳ERP
2019/12/05
2K0
5个使用ERP软件改进业务流程的方法
组织变更管理和计划将是实施项目成功的主要因素。让组织的各个层次参与该项目是一个很好的开始,但是随着对日常运营的变更的开始,制定一个具体的计划将有助于加快用户采用速度,并避免错误信息和混乱情况的传播。成功的变更管理策略牢记公司的使命,并向员工明确说明这些变更将如何帮助公司实现其目标,从而形成共同的变更愿景。必须制定一个计划,以教育员工如何改变其日常工作的细节,并奖励鼓励个人承担新角色和责任的奖励。
深圳ERP
2019/12/10
5100
5个使用ERP软件改进业务流程的方法
推荐阅读
相关推荐
ERP vs MRP,傻傻分不清楚?
更多 >
LV.1
深圳市鑫北斗软件运营
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档