±à¼ÍƼö: |
±¾ÎÄÀ´×Ôcsdn£¬±¾ÎÄÖ÷Òª½²ÊöÁËCIMS
ÏîÄ¿´Ó΢·þÎñ¼Ü¹¹ÑÝ»¯µ½Î¢Ç°¶Ë½ø¶øÍê³ÉÏµÍ³È«ÃæÎ¢·þÎñ»¯µÄ¼Ü¹¹Ñݽø¡£ |
|
ǰÑÔ
΢ǰ¶ËÓÉThoughtWorks 2016ÄêÌá³ö£¬½«ºó¶Ë΢·þÎñµÄÀíÄîÓ¦ÓÃÓÚä¯ÀÀÆ÷¶Ë£¬¼´½« Web Ó¦ÓÃÓɵ¥Ò»µÄµ¥ÌåÓ¦ÓÃת±äΪ¶à¸öСÐÍǰ¶ËÓ¦ÓþۺÏΪһµÄÓ¦Óá£
ÃÀÍÅÒѾÊÇÒ»¼ÒÓµÓм¸ÍòÈ˹æÄ£µÄ´óÐÍ»¥ÁªÍø¹«Ë¾£¬ÌáÉýÕûÌåЧÂÊÖÁ¹ØÖØÒª£¬ÕâÐèÒªºÜ¶àÄÚ²¿ºÍÍⲿµÄ¹ÜÀíϵͳÀ´Ö§³Å¡£ÓÉÓÚÕâЩϵͳ֮¼ä´æÔÚ´óÁ¿µÄÁ¬Í¨ºÍ½»»¥ËßÇó£¬Òò´ËÎÒÃÇÏ£ÍûÄܹ»°´ÕÕÓû§ºÍʹÓó¡¾°½«ÕâЩϵͳ»ã×ܳÉÒ»¸ö»òÕß¼¸¸ö×ۺϵÄϵͳ¡£
ÎÒÃǰÑÕâÖÖÓɶà¸ö΢ǰ¶Ë¾ÛºÏ³öÀ´µÄµ¥Ò³Ó¦ÓýÐ×ö¡°À൥ҳӦÓá±£¬ÃÀÍÅHRϵͳ¾ÍÊÇ»ùÓÚÕâÖÖÉè¼ÆÊµÏֵġ£ÃÀÍÅHRϵͳÊÇÓÉ30¶à¸ö΢ǰ¶ËÓ¦Óþۺ϶ø³É£¬°üº¬1000¶à¸öÒ³Ãæ£¬300¶à¸öµ¼º½²Ëµ¥Ïî¡£¶ÔÓû§À´Ëµ£¬HRϵͳÊÇÒ»¸öµ¥Ò³Ó¦Óã¬Õû¸ö½»»¥¹ý³Ì·Ç³£Ë³³©£»¶Ô¿ª·¢ÕßͬѧÀ´Ëµ£¬¸÷¸öÓ¦Óþù¿É¶ÀÁ¢¿ª·¢¡¢¶ÀÁ¢²âÊÔ¡¢¶ÀÁ¢·¢²¼£¬´ó´óÌá¸ßÁË¿ª·¢Ð§ÂÊ¡£
½ÓÏÂÀ´£¬±¾ÎĽ«Îª´ó¼Ò½éÉÜ¡°Î¢Ç°¶Ë¹¹½¨À൥ҳӦÓá±ÔÚÃÀÍÅHRϵͳÖеÄһЩʵ¼ù¡£Í¬Ê±Ò²·ÖÏíһЩÎÒÃǵÄ˼¿¼ºÍ¾Ñ飬ϣÍûÄܹ»¶Ô´ó¼ÒÓÐËùÆô·¢¡£
HRϵͳµÄ΢ǰ¶ËÉè¼Æ
ÒòΪÃÀÍŵÄHRϵͳËùÉæ¼°ÏîÄ¿±È½Ï¶à£¬Ä¿Ç°ÓÉÈý¸öÍŶÓÀ´¸ºÔð¡£ÆäÖУºOAÍŶӸºÔð¿¼ÇÚ¡¢ºÏͬ¡¢Á÷³ÌµÈ¹¦ÄÜ£¬HRÍŶӸºÔðÈëÖ°¡¢×ªÕý¡¢µ÷¸Ú¡¢ÀëÖ°µÈ¹¦ÄÜ£¬ÉϺ£ÍŶӸºÔð¼¨Ð§¡¢ÕÐÆ¸µÈ¹¦ÄÜ¡£ÕâÖÖÍŶӺ͹¦ÄܵĻ®·Öģʽ£¬Ê¹µÃÿ¸öϵͳ¶¼ÊÇÏà¶Ô¶ÀÁ¢µÄ£¬ÓµÓжÀÁ¢µÄÓòÃû¡¢¶ÀÁ¢µÄUIÉè¼Æ¡¢¶ÀÁ¢µÄ¼¼ÊõÕ»¡£µ«ÊÇ£¬ÕâÑù»á´øÀ´¿ª·¢ÍŶÓÖ®¼äÖ°Ôð»®·Ö²»Çå¡¢Óû§ÌåÑéЧ¹û²îµÈÎÊÌ⣬ËùÒÔ¾ÍÆÈÇÐÐèÒª°ÑHRϵͳת±ä³ÉÖ»ÓÐÒ»¸öÓòÃûºÍÒ»Ì×չʾ·ç¸ñµÄϵͳ¡£
ΪÁËÂú×㹫˾ҵÎñ·¢Õ¹µÄÒªÇó£¬ÎÒÃÇ×öÁËÒ»¸öHRµÄÃÅ»§Ò³Ã棬°Ñ¸÷¸ö×ÓϵͳµÄÈë¿Ú×öÁËÁ´½Ó¹é£¡£È»¶øÎÒÃÇ·¢ÏÖHRÃÅ»§µÄÒâÒå·Ç³£Ð¡£¬Óû§Ìø×ªÁ½´ÎÖ®ºó£¬ÓÖÍêÈ«²»ÖªµÀÌøµ½ÄÄÀïÈ¥ÁË¡£Òò´ËÎÒÃÇͨ¹ý½«HRϵͳÕûºÏΪһ¸öÓ¦Óõķ½Ê½£¬À´½â¾öÒÔÉÏÎÊÌâ¡£
Ò»°ã¶øÑÔ£¬¡°À൥ҳӦÓá±µÄʵÏÖ·½Ê½Ö÷ÒªÓÐÁ½ÖÖ£º
1. iframeǶÈë
2. ΢ǰ¶ËºÏ²¢À൥ҳӦÓÃ
ÆäÖУ¬iframeǶÈ뷽ʽÊDZȽÏÈÝÒ×ʵÏֵ쬵«ÔÚʵ¼ùµÄ¹ý³ÌÖдøÀ´ÁËÈçÏÂÎÊÌ⣺
* ×ÓÏîÄ¿ÐèÒª¸ÄÔ죬ÐèÒªÌṩһ×é²»´øµ¼º½µÄ¹¦ÄÜ
* iframeǶÈëµÄÏÔÊ¾Çø´óС²»ÈÝÒ׿ØÖÆ£¬´æÔÚÒ»¶¨¾ÖÏÞÐÔ
* URLµÄ¼Ç¼ÍêÈ«ÎÞЧ£¬Ò³ÃæË¢Ð²»Äܹ»±»¼ÇÒ䣬ˢл᷵»ØÊ×Ò³
* iframe¹¦ÄÜÖ®¼äµÄÌø×ªÊÇÎÞЧµÄ
* iframeµÄÑùʽÏÔʾ¡¢¼æÈÝÐԵȶ¼¾ßÓоÖÏÞÐÔ
¿¼Âǵ½ÕâЩÎÊÌ⣬iframeǶÈë²¢²»ÄÜÂú×ãÎÒÃǵÄÒµÎñËßÇó£¬ËùÒÔÎÒÃÇ¿ªÊ¼ÓÃ΢ǰ¶ËµÄ·½Ê½À´´î½¨HRϵͳ¡£
ÔÚÕâ¸ö΢ǰ¶ËµÄ·½°¸ÀÓм¸¸öÎÒÃDZØÐëÒª½â¾öµÄÎÊÌ⣺
1. Ò»¸öǰ¶ËÐèÒª¶ÔÓ¦¶à¸öºó¶Ë
2. ÌṩһÌ×Ó¦ÓÃ×¢²á»úÖÆ£¬Íê³ÉÓ¦ÓõÄÎÞ·ìÕûºÏ
3. ¹¹½¨Ê±¼¯³ÉÓ¦ÓúÍÓ¦ÓöÀÁ¢·¢²¼²¿Êð
Ö»Óнâ¾öÁËÒÔÉÏÎÊÌ⣬ÎÒÃǵɲÅÊÇÓÐЧÇÒÕæÕý¿ÉÂ䵨µÄ£¬½ÓÏÂÀ´Ïêϸ½²½âÒ»ÏÂÕ⼸¸öÎÊÌâµÄʵÏÖ˼·¡£
Ò»¸öǰ¶Ë¶ÔÓ¦¶à¸öºó¶Ë
HRϵͳ×îÖÕÏßÉÏÔËÐеÄÊÇÒ»¸öµ¥Ò³Ó¦Ó㬶øÏîÄ¿¿ª·¢ÖÐÒªÇóÓ¦ÓöÀÁ¢£¬Òò´ËÎÒÃÇн¨ÁËÒ»¸öÈë¿ÚÏîÄ¿£¬ÓÃÓÚÕûºÏ¸÷¸öÓ¦Óá£ÔÚÎÒÃǵÄʵ¼ùÖУ¬°ÑÕâ¸öÏîÄ¿½Ð×ö¡°PortalÏîÄ¿¡±»ò¡°Ö÷ÏîÄ¿¡±£¬ÒµÎñÓ¦ÓýÐ×ö¡°×ÓÏîÄ¿¡±£¬Õû¸öÏîÄ¿½á¹¹Í¼ÈçÏÂËùʾ£º

¡°PortalÏîÄ¿¡±ÊDZȽÏÌØÊâµÄ£¬ÔÚ¿ª·¢½×¶ÎÊÇÒ»¸öÈÝÆ÷£¬²»°üº¬ÈκÎÒµÎñ£¬³ýÁËÌṩ¡°×ÓÏîÄ¿¡±×¢²á¡¢ºÏ²¢¹¦ÄÜÍ⣬»¹¿ÉÒÔÌṩһЩϵͳ¼¶¹«¹²Ö§³Ö£¬ÀýÈ磺
* Óû§µÇ¼»úÖÆ
* ²Ëµ¥È¨ÏÞ»ñÈ¡
* È«¾ÖÒì³£´¦Àí
* È«¾ÖÊý¾Ý´òµã
¡°×ÓÏîÄ¿¡±¶ÔÍâÊä³ö²»ÐèÒªÈë¿ÚHTMLÒ³Ãæ£¬Ö»ÐèÒªÊä³öµÄ×ÊÔ´Îļþ¼´¿É£¬×ÊÔ´Îļþ°üÀ¨js¡¢css¡¢fontsºÍimgsµÈ¡£
HRϵͳÔÚÏßÉÏÔËÐÐÁËÒ»¸öǰ¶Ë·þÎñ£¨Node Server£©£¬Õâ¸öServerÓÃÓÚÏìÓ¦Óû§µÇ¼¡¢¼øÈ¨¡¢×ÊÔ´µÄÇëÇó¡£HRϵͳµÄÊý¾ÝÇëÇó²¢Ã»Óо¹ýǰ¶Ë·þÎñ×ö͸´«£¬¶øÊDZ»Nginxת·¢µ½ºó¶ËServerÉÏ£¬¾ßÌå½»»¥ÈçÏÂͼËùʾ£º

ת·¢¹æÔòÉÏÏÞÖÆÊý¾ÝÇëÇó¸ñʽ±ØÐëÊÇ ÏµÍ³Ãû+Api×öǰ׺ ÕâÑù±£ÕÏÁ˸÷¸öϵͳ֮¼äµÄÇëÇó¿ÉÒÔÍêÈ«¸ôÀë¡£
ÆäÖУ¬NginxµÄÅäÖÃʾÀýÈçÏ£º
server {
listen 80;
server_name xxx.xx.com;
location /project/api/ {
set $upstream_name "server.project";
proxy_pass http://$upstream_name;
}
...
location / {
set $upstream_name "web.portal";
proxy_pass http://$upstream_name;
}
} |
ÎÒÃǽ«Óû§µÄͳһµÇ¼ºÍÈÏÖ¤ÎÊÌâ½»¸øÁËSSO£¬ËùÓеÄÏîÄ¿µÄºó¶ËServer¶¼Òª½ÓÈëSSOУÑéµÇ¼״̬£¬´Ó¶ø±£ÕÏÒµÎñϵͳ¼äÓû§°²È«ÈÏÖ¤µÄÒ»ÖÂÐÔ¡£
ÔÚÏîÄ¿½á¹¹È·¶¨ÒÔºó£¬Ó¦ÓÃÈçºÎ½øÐкϲ¢ÄØ£¿Òò´Ë£¬ÎÒÃÇ¿ªÊ¼Öƶ¨ÁËÒ»Ì×Ó¦ÓÃ×¢²á»úÖÆ¡£
Ó¦ÓÃ×¢²á»úÖÆ
¡°PortalÏîÄ¿¡±Ìṩע²áµÄ½Ó¿Ú£¬¡°×ÓÏîÄ¿¡±½øÐÐ×¢²á£¬×îÖվۺϳÉÒ»¸öµ¥Ò³Ó¦Óá£ÔÚÕûÌ×»úÖÆÖУ¬±È½ÏºËÐĵIJ¿·ÖÊÇ·ÓÉ×¢²á»úÖÆ£¬¡°×ÓÏîÄ¿¡±µÄ·ÓÉÓ¦¸ÃÓÉ×Ô¼º¿ØÖÆ£¬¶øÕû¸öϵͳµÄµ¼º½ÊÇ¡°PortalÏîÄ¿¡±ÌṩµÄ¡£
·ÓÉ×¢²á
·ÓɵĿØÖÆÓÉÈý²¿·Ö×é³É£ºÈ¨Ï޲˵¥Ê÷¡¢µ¼º½ºÍ·ÓÉÊ÷£¬¡°PortalÏîÄ¿¡±Öзâ×°Ò»¸ö×é¼þApp£¬¸ù¾Ý²Ëµ¥Ê÷ºÍ·ÓÉÊ÷Éú³ÉÕû¸öÒ³Ãæ¡£Â·ÓɹÒÔØµ½DOMÊ÷ÉϵĴúÂëÈçÏ£º
let Router =
<Router
fetchMenu = {fetchMenuHandle}
routes = {routes}
app = {App}
history = {history} >
ReactDOM.render (Router,document.querySelector ("#app")); |
RouterÊÇÔÚreact-routerµÄ»ù´¡ÉÏ×öÁËÒ»²ã·â×°£¬Í¨¹ýmenuºÍroutes×îºóÉú³ÉÒ»¸öÈçÏÂËùʾµÄ·ÓÉÊ÷£º
<Router>
<Route path="/" component={App}>
<Route path="/namespace/xx" component={About}
/> <Route path="inbox" component={Inbox}>
<Route path="messages/:id" component={Message}
/> </Route> </Route>
</Router> |
¾ßÌå×¢²áʹÓÃÁËÈ«¾ÖµÄwindow.app.routes£¬¡°PortalÏîÄ¿¡±´Ówindow.app.routes»ñȡ·ÓÉ£¬¡°×ÓÏîÄ¿¡±°Ñ×Ô¼ºÐèҪע²áµÄ·ÓÉÌí¼Óµ½window.app.routesÖУ¬×ÓÏîÄ¿µÄ×¢²áÈçÏÂ:
let app = window.app
= window.app || {};
app.routes = (app.routes || []).concat([
{
code:'attendance-record',
path: '/attendance-record',
component: wrapper(() => async(require('./nodes/attendance-record'),
'kaoqin')),
}]); |
·Óɺϲ¢µÄͬʱҲ°Ñ¾ßÌåµÄ¹¦ÄÜ×öÁËÒýÓùØÁª£¬ÔÙµ½¹¹½¨Ê±¾Í¿ÉÒÔ°ÑËùÓеŦÄÜÓë·ÓɹÜÀíÆðÀ´¡£ÏîÄ¿µÄ×÷ÓÃÓòÒªÔõô¿ØÖÆÄØ£¿ÎÒÃÇÒªÇó¡°×ÓÏîÄ¿¡±¼äÊDZ˴˸ôÀ룬Ҫ±ÜÃâÑùʽÎÛȾ£¬Òª×ö¶ÀÁ¢µÄÊý¾ÝÁ÷¹ÜÀí£¬ÎÒÃÇÓÃÏîÄ¿×÷ÓÃÓòµÄ·½Ê½À´½â¾öÕâЩÎÊÌâ¡£
ÏîÄ¿×÷ÓÃÓò¿ØÖÆ
ÔÚ·ÓÉ¿ØÖƵÄʱºòÎÒÃÇÌáµ½ÁË window.app£¬ÎÒÃÇÒ²ÊÇͨ¹ýÕâ¸öÈ«¾ÖAppÀ´×öÏîÄ¿×÷ÓÃÓòµÄ¿ØÖÆ¡£window.app°üº¬ÁËÈçϼ¸²¿·Ö£º
let app = window.app
|| {};
app = {
require:function(request){...},
define:function(name,context,index){...},
routes:[...],
init:function(namespace,reducers){...}
}; |
window.appÖ÷Òª¹¦ÄÜ£º
* define ¶¨ÒåÏîÄ¿µÄ¹«¹²¿â£¬Ö÷ÒªÓÃÀ´½â¾öJS¹«¹²¿âµÄ¹ÜÀíÎÊÌâ
* require ÒýÓÃ×Ô¼ºµÄ¶¨ÒåµÄ»ù´¡¿â£¬ÅäºÏdefineÀ´Ê¹ÓÃ
* routes ÓÃÓÚ´æ·ÅÈ«¾ÖµÄ·ÓÉ£¬×ÓÏîĿ·ÓÉÌí¼Óµ½window.app.routes£¬ÓÃÓÚÍê³É·ÓɵÄ×¢²á
* init ×¢²áÈë¿Ú£¬Îª×ÓÏîÄ¿Ìí¼ÓÉÏnamesapce±êʶ£¬×¢²áÉÏ×ÓÏîÄ¿¹ÜÀíÊý¾ÝÁ÷µÄreducers
×ÓÏîÄ¿ÍêÕûµÄ×¢²á£¬ÈçÏÂËùʾ£º
import reducers
from './redux/kaoqin-reducer';
let app = window.app = window.app || {};
app.routes = (app.routes || []).concat([
{
code:'attendance-record',
path: '/attendance-record',
component: wrapper(() => async(require('./nodes/attendance-record'),
'kaoqin')),
// ... ÆäËû·ÓÉ
}]);
function wrapper(loadComponent) {
let React = null;
let Component = null;
let Wrapped = props => ( <div className="namespace-kaoqin">
<Component {...props} /> </div>
);
return async () => {
await window.app.init('namespace-kaoqin',reducers);
React = require('react');
Component = await loadComponent();
return Wrapped;
};
} |
ÆäÖÐ×öÁËÕ⼸¼þÊÂÇ飺
1. °Ñ·ÓÉÌí¼Óµ½window.appÖÐ
2. ÒµÎñµÚÒ»´Î¹¦Äܱ»µ÷ÓõÄʱºòÖ´ÐÐ window.app.init(namespace,reducers)£¬×¢²áÏîÄ¿×÷ÓÃÓòºÍÊý¾ÝÁ÷µÄreducers
3. ¶ÔÒµÎñ¹¦ÄܵĹÒÔØ½Úµã°ü×°Ò»¸ö¸ù½Úµã£ºComponent¹ÒÔØÔÚclassNameΪnamespace-kaoqinµÄdivÏÂÃæ
ÕâÑù¾ÍÍê³ÉÁË¡°×ÓÏîÄ¿¡±µÄ×¢²á£¬¡°×ÓÏîÄ¿¡±µÄ¶ÔÍâÊä³öÊÇÒ»¸öÈë¿ÚÎļþºÍһϵÁеÄ×ÊÔ´Îļþ£¬ÕâЩÎļþÓÉwebpack¹¹½¨Éú³É¡£
CSS×÷ÓÃÓò·½Ã棬ʹÓÃwebpackÔÚ¹¹½¨½×¶ÎΪҵÎñµÄËùÓÐCSS¶¼¼ÓÉÏ×Ô¼ºµÄ×÷ÓÃÓò£¬¹¹½¨ÅäÖÃÈçÏ£º
//webpack´ò°ü²¿·Ö£¬ÔÚpostcss²å¼þÖÐ
Ìí¼ÓnamespaceµÄ¿ØÖÆ
config.postcss.push(postcss.plugin('namespace',
() => css =>
css.walkRules(rule => {
if (rule.parent && rule.parent.type ===
'atrule' && rule.parent.name !== 'media')
return;
rule.selectors = rule.selectors.map(s => `.namespace-kaoqin
${s === 'body' ? '' : s}`);
})
)); |
CSS´¦ÀíÓõ½postcss-loader£¬postcss-loaderÓõ½postcss£¬ÎÒÃÇÌí¼ÓpostcssµÄ´¦Àí²å¼þ£¬ÎªÃ¿Ò»¸öCSSÑ¡ÔñÆ÷¶¼Ìí¼ÓÃûΪ.namespace-kaoqinµÄ¸ùÑ¡ÔñÆ÷£¬×îºó´ò°ü³öÀ´µÄCSS£¬ÈçÏÂËùʾ£º
.namespace-kaoqin
.attendance-record {
height: 100%;
position: relative
}
.namespace-kaoqin .attendance-record .attendance-record-content
{
font-size: 14px;
height: 100%;
overflow: auto;
padding: 0 20px
}
... |
CSSÑùʽÎÊÌâ½â¾öÖ®ºó£¬½ÓÏÂÀ´¿´Ò»Ï£¬PortalÌṩµÄinit×öÁËÄÄЩ¹¤×÷¡£
let inited =
false;
let ModalContainer = null;
app.init = async function (namespace,reducers)
{
if (!inited) {
inited = true;
let block = await new Promise(resolve => {
require.ensure([], function (require) {
app.define('block', require.context('block', true,
/^\.\/(?!dev)([^\/]|\/(?!demo))+\.jsx?$/));
resolve(require('block'));
}, 'common');
});
ModalContainer = document.createElement('div');
document.body.appendChild(mtfv3ModalContainer);
let { Modal} = block;
Modal.getContainer = () => ModalContainer;
}
ModalContainer.setAttribute('class', `${namespace}`);
mountReducers(namepace,reducers)
}; |
init·½·¨Ö÷Òª×öÁËÁ½¼þÊÂÇ飺
1. ¹ÒÔØ¡°×ÓÏîÄ¿¡±µÄreducers£¬°Ñ¡°×ÓÏîÄ¿¡±µÄÊý¾ÝÁ÷¹ÒÔØÁËreduxÉÏ
2. ¡°×ÓÏîÄ¿¡±µÄµ¯³ö´°È«²¿¹ÒÔØÔÚÒ»¸öÈ«¾ÖµÄdivÉÏ£¬²¢ÎªÕâ¸ödivÌí¼Ó¶ÔÓ¦µÄÏîÄ¿×÷ÓÃÓò£¬ÅäºÏ¡°×ÓÏîÄ¿¡±¹¹½¨µÄCSS£¬È·±£µ¯³ö¿òÑùʽÕýÈ·
ÉÏÊö´úÂëÖл¹¿´µ½ÁËapp.defineµÄÓ÷¨£¬ËüÖ÷ÒªÊÇÓÃÀ´´¦ÀíJS¹«¹²¿âµÄ¿ØÖÆ£¬ÀýÈçÎÒÃÇÓõ½µÄ×é¼þ¿âBlock£¬ÆÚÍûÿ¸ö¡°×ÓÏîÄ¿¡±µÄ°æ±¾¶¼ÊÇͳһµÄ¡£Òò´ËÎÒÃÇÐèÒª½â¾öJS¹«¹²¿â°æ±¾Í³Ò»µÄÎÊÌâ¡£
JS¹«¹²¿â°æ±¾Í³Ò»
ΪÁ˲»ÇÖÈë¡°×ÓÏîÄ¿¡±£¬ÎÒÃDzÉÓù¹½¨¹ý³ÌÖÐÌæ»»µÄ·½Ê½À´×ö£¬¡°PortalÏîÄ¿¡±°Ñ¹«¹²¿âÒýÈë½øÀ´£¬ÖØÐ¶¨Ò壬Ȼºóͨ¹ýwindow.app.requireµÄ·½Ê½ÒýÓã¬ÔÚ±àÒë¡°×ÓÏîÄ¿¡±µÄʱºò£¬°ÑÒýÓù«¹²¿âµÄ´úÂë´Órequire('react')È«²¿Ì滻Ϊwindow.app.require('react')£¬ÕâÑù¾Í¿ÉÒÔ½«JS¹«¹²¿âµÄ°æ±¾¶¼½»¸ø¡°PortalÏîÄ¿¡±À´¿ØÖÆÁË¡£
define µÄ´úÂëºÍʾÀýÈçÏ£º
/**
* ÖØÐ¶¨Òå°ü
* @param name ÒýÓõİüÃû£¬ÀýÈç react
* @param context ×ÊÔ´ÒýÓÃÆ÷ ʵ¼ÊÉÏÊÇ webpackContext£¨ÊÇÒ»¸ö·½·¨£¬À´ÒýÓÃ×ÊÔ´Îļþ£©
* @param index ¶¨ÒåµÄ°üµÄÈë¿ÚÎļþ
*/
app.define = function (name, context, index) {
let keys = context.keys();
for (let key of keys) {
let parts = (name + key.slice(1)).split('/');
let dir = this.modules;
for (let i = 0; i < parts.length - 1; i++)
{
let part = parts[i];
if (!dir.hasOwnProperty(part)) {
dir[part] = {};
}
dir = dir[part];
}
dir[parts[parts.length - 1]] = context.bind(context,
key);
}
if (index != null) {
this.modules[name]['index.js'] = this.modules[name][index];
}
};
//¶¨ÒåappµÄreact
//¶¨ÒåÒ»¸öreact×ÊÔ´¿â£º°ÑÔÀ´react¸ùĿ¼ºÍlibĿ¼ÏµÄ.jsÈ«²¿»ñÈ¡µ½£¬°ó¶¨µ½Ð¶¨ÒåµÄreactÖУ¬²¢Ö¸¶¨react.js×÷ΪÈë¿ÚÎļþ
app.define('react', require.context('react', true,
/^.\/(lib\/)?[^\/]+\.js$/), 'react.js');
app.define('react-dom', require.context('react-dom',
true, /^.\/index\.js$/)); |
¡°×ÓÏîÄ¿¡±µÄ¹¹½¨£¬Ê¹ÓÃwebpackµÄexternals£¨ÍⲿÀ©Õ¹£©À´¶ÔÒýÓýøÐÐÌæ»»£º
/**
* ¶ÔһЩ¹«¹²°üµÄÒýÓÃ×ö´¦Àí ͨ¹ýwebpackµÄexternals£¨ÍⲿÀ©Õ¹£©À´½â¾ö
*/
const libs = ['react', 'react-dom', "block"];
module.exports = function (context, request,
callback) {
if (libs.indexOf(request.split('/', 1)[0]) !==
-1) {
//Èç¹ûÎļþµÄrequire·¾¶Öаüº¬libsÖÐµÄ Ìæ»»Îª window.app.require('${request}');
//varÔÚÕâ¶ùÊÇÉùÃ÷µÄÒâ˼
callback(null, `var window.app.require('${request}')`);
} else {
callback();
}
}; |
ÕâÑùÏîÄ¿µÄ×¢²á¾ÍÍê³ÉÁË£¬»¹ÓÐһЩÐèÒª¡°×ÓÏîÄ¿¡±×Ô¼º¸ÄÔìµÄµØ·½£¬ÀýÈç±¾µØÆô¶¯ÐèÒª°Ñ¡°PortalÏîÄ¿¡±µÄµ¼º½¼ÓÔØ½øÀ´£¬ÐèÒª×ömockÊý¾ÝµÈµÈ¡£
ÏîÄ¿µÄ×¢²áÍê³ÉÁË£¬ÎÒÃÇÈçºÎ·¢²¼²¿ÊðÄØ£¿
¹¹½¨ºó¼¯³ÉºÍ¶ÀÁ¢²¿Êð
ÔÚHRϵͳµÄÕûºÏ¹ý³ÌÖУ¬¿ª·¢½×¶Î¶Ô¡°×ÓÏîÄ¿¡±ÊÇ¡°ÁãÇÖÈ롱£¬¶øÔÚ·¢²¼½×¶Î£¬ÎÒÃÇҲϣÍûÈç´Ë¡£
ÎÒÃǵIJ¿Êð¹ý³Ì£¬´ó¸ÅÈçÏ£º

µÚÒ»²½£ºÔÚ·¢²¼»úÉÏ£¬»ñÈ¡´úÂë¡¢°²×°ÒÀÀµ¡¢Ö´Ðй¹½¨£»
µÚ¶þ²½£º°Ñ¹¹½¨µÄ½á¹ûÉÏ´«µ½·þÎñÆ÷£»
µÚÈý²½£ºÔÚ·þÎñÆ÷Ö´ÐÐ node index.js °Ñ·þÎñÆô¶¯ÆðÀ´¡£
¡°PortalÏîÄ¿¡±¹¹½¨Ö®ºóµÄÎļþ½á¹¹ÈçÏ£º

¡°×ÓÏîÄ¿¡±¹¹½¨ºóµÄÎļþ½á¹¹ÈçÏ£º

ÏßÉÏÔËÐеÄÎļþ½á¹¹ÈçÏ£º

°Ñ¡°×ÓÏîÄ¿¡±µÄ¹¹½¨ÎļþÉÏ´«µ½·þÎñÆ÷¶ÔÓ¦µÄ¡°×ÓÏîÄ¿¡±ÎļþĿ¼Ï£¬È»ºó¶Ô¡°×ÓÏîÄ¿¡±µÄ×ÊÔ´Îļþ½øÐм¯³ÉºÏ²¢£¬Éú³É.distĿ¼ÖеÄÎļþ£¬Ìṩ¸øÓû§ÏßÉÏ·ÃÎÊʹÓá£
ÿ´Î·¢²¼£¬ÎÒÃÇÖ÷Òª×öÒÔÏÂÈý¼þÊÂÇ飺
1. ·¢²¼×îеľ²Ì¬×ÊÔ´Îļþ
2. ÖØÐÂÉú³Éentry-xx.jsºÍindex.html£¨¸üÐÂÈë¿ÚÒýÓã©
3. ÖØÆôǰ¶Ë·þÎñ
Èç¹ûÊÇ´¿¾²Ì¬·þÎñ£¬ÍêÈ«¿ÉÒÔ×öµ½ÈȲ¿Ê𣬶¯Ì¬¸üÐÂÒ»ÏÂÒýÓùØÏµ¼´¿É£¬²»ÐèÒªÖØÆô·þÎñ¡£ÒòΪÎÒÃÇÔÚNode·þÎñ²ã×öÁËһЩ¹«¹²·þÎñ£¬ËùÒÔÑ¡ÔñÁËÖØÆô·þÎñ£¬ÎÒÃÇʹÓÃÁ˹«Ë¾µÄ»ù´¡·þÎñºÍPM2À´ÊµÏÖÈÈÆô¶¯¡£
¶ÔÓÚÀúÊ·Îļþ£¬ÎÒÃÇÐèÒª×ö°æ±¾¿ØÖÆ£¬ÒÔ±£ÕÏ֮ǰµÄ·ÃÎÊÄܹ»Õý³£ÔËÐС£´ËÍ⣬ΪÁ˱£Ö¤·þÎñµÄ¸ß¿ÉÓÃÐÔ£¬ÎÒÃÇÉÏÏßÁË4̨»úÆ÷£¬·Ö±ðÔÚÁ½¸ö»ú·¿½øÐв¿Êð£¬×îÖÕÀ´Ìá¸ßHRϵͳµÄÈÝ´íÐÔ¡£
×ܽá
ÒÔÉϾÍÊÇÎÒÃÇʹÓÃReact¼¼ÊõÕ»ºÍ΢ǰ¶Ë·½Ê½´î½¨µÄ¡°À൥ҳӦÓá±HRÒµÎñϵͳ£¬»Ø¹ËÒ»ÏÂÕâ¸ö¼¼Êõ·½°¸£¬Õû¸ö¿ò¼ÜÁ÷³ÌÈçÏÂͼËùʾ£º

ÔÚ²úÆ·²ãÃæÉÏ£¬¡°Î¢Ç°¶ËÀ൥ҳӦÓá±´òÆÆÁ˶ÀÁ¢ÏîÄ¿µÄ¸ÅÄÎÒÃÇ¿ÉÒÔ¸ù¾ÝÓû§µÄÐèÇó×ÔÓÉ×é×°ÎÒÃǵÄÒ³ÃæÓ¦Óã¬ÀýÈ磺ÎÒÃÇ¿ÉÒÔÔÚHRÃÅ»§Éϰѿ¼ÇÚ¡¢Çë¼Ù¡¢OAÉóÅú¡¢²ÆÎñ±¨ÏúµÈ¸ßƵ¹¦ÄÜ·ÅÔÚÒ»Æð¡£ÉõÖÁ¿ÉÒÔÈÃÓû§×Ô¼º¶¨Öƹ¦ÄÜ£¬ÈÃÓû§ÕæµÄ¸ÐÊܵ½ÎÒÃÇÊÇÒ»¸öϵͳ¡£
¡°Î¢Ç°¶Ë¹¹½¨À൥ҳӦÓá±·½°¸ÊÇ»ùÓÚReact¼¼ÊõÕ»¿ª·¢£¬Èç¹û°Ñ·ÓɹÜÀí»úÖÆºÍ×¢²á»úÖÆ³éÀë³öÀ´×÷Ϊһ¸ö¹«¹²µÄ¿â£¬¾Í¿ÉÒÔÔÚwebpackµÄ»ù´¡ÉÏ·â×°³ÉÒ»¸öÒµÎñÎÞ¹ØÐÔµÄͨÓ÷½°¸£¬¶øÇÒʹÓÃÆðÀ´·Ç³£µÄÓѺá£
½ØÖ¹Ä¿Ç°£¬HRϵͳÒѾÎȶ¨ÔËÐÐÁË1Äê¶àµÄʱ¼ä£¬ÎÒÃÇ×ܽáÁËÒÔÏÂÈý¸öÓŵ㣺
1. µ¥Ò³Ó¦ÓõÄÌåÑé±È½ÏºÃ£¬°´Ðè¼ÓÔØ£¬½»»¥Á÷³©
2. ÏîĿ΢ǰ¶Ë»¯£¬ÒµÎñ½âñÎȶ¨ÐÔÓб£ÕÏ£¬ÏîÄ¿µÄÁ£¶ÈÒ׿ØÖÆ
3. ÏîÄ¿µÄ½¡×³ÐԱȽϺã¬ÏîĿע²á½ö½öÔö¼ÓÁËÈë¿ÚÎļþµÄ´óС£¬30¶à¸öÏîĿĿǰֻÓÐ12K
|