diff --git a/packages/chameleon-loader/src/loader.js b/packages/chameleon-loader/src/loader.js index 939f967dfb01ef3c374594f96e5206299ef04bce..f22425021bcf731237491fa2abda8cf02ba4a431 100644 --- a/packages/chameleon-loader/src/loader.js +++ b/packages/chameleon-loader/src/loader.js @@ -15,6 +15,7 @@ var jsonHandler = require('./cml-compile/json-handle.js'); const { getScriptCode } = require('./interface-check/getScriptCode.js'); const cmlUtils = require('chameleon-tool-utils'); const prehandle = require('./utils/prehandle.js'); +const loaderMethods = require('./loaderMethods'); let jsonObject = {}; module.exports = function (content) { @@ -442,24 +443,13 @@ module.exports = function (content) { * }] */ function prepareParseUsingComponents(originObj) { - return Object.keys(originObj).map(key=>{ - let value = originObj[key]; - let {filePath, refUrl} = cmlUtils.handleComponentUrl(context, self.resourcePath, value, cmlType); - // 如果是node_modules中的refUrl中会变成npm,替换成node_modules后再查找组件 - if(~value.indexOf('/npm') && filePath === '') { - value = value.replace('/npm/','/node_modules/'); - filePath = cmlUtils.handleComponentUrl(context, self.resourcePath, value, cmlType).filePath; - } - return { - tagName: key, - refUrl, - filePath, - isNative: !filePath.endsWith('.cml') - } + return loaderMethods.prepareParseUsingComponents({ + loaderContext: self, + context, + originObj, + cmlType }) - } - // done return output } diff --git a/packages/chameleon-loader/src/loaderMethods.js b/packages/chameleon-loader/src/loaderMethods.js new file mode 100644 index 0000000000000000000000000000000000000000..47546564bb11ca672377349d12338c4d31a39957 --- /dev/null +++ b/packages/chameleon-loader/src/loaderMethods.js @@ -0,0 +1,20 @@ + +const cmlUtils = require('chameleon-tool-utils'); + +exports.prepareParseUsingComponents = function({loaderContext, context, originObj, cmlType}) { + return Object.keys(originObj).map(key => { + let value = originObj[key]; + let {filePath, refUrl} = cmlUtils.handleComponentUrl(context, loaderContext.resourcePath, value, cmlType); + // 如果是node_modules中的refUrl中会变成npm,替换成/node_modules/后再查找组件 + if (~value.indexOf('/npm') && filePath === '') { + value = value.replace(/(.*?)npm\//g, '/node_modules/'); + filePath = cmlUtils.handleComponentUrl(context, loaderContext.resourcePath, value, cmlType).filePath; + } + return { + tagName: key, + refUrl, + filePath, + isNative: !filePath.endsWith('.cml') + } + }) +} diff --git a/packages/chameleon-loader/test/src/loaderMethods.test.js b/packages/chameleon-loader/test/src/loaderMethods.test.js new file mode 100644 index 0000000000000000000000000000000000000000..7f705835d73b350d50c57296ca1625d5be4f20af --- /dev/null +++ b/packages/chameleon-loader/test/src/loaderMethods.test.js @@ -0,0 +1,58 @@ +const loaderMethods = require('../../src/loaderMethods.js'); +const expect = require('chai').expect; +const path = require('path'); + +describe('prepareParseUsingComponents', function(){ + it('/npm/', function() { + let originObj = { + scroller: '/npm/cml-ui/scroller/scroller' + } + let loaderContext = { + resourcePath: path.join(__dirname, './project/src/pages/page1.cml') + } + + let context = path.join(__dirname, './project'); + let result = loaderMethods.prepareParseUsingComponents({ + loaderContext, + context, + originObj, + cmlType: 'wx' + }); + + let expectPath = path.join(__dirname, './project/node_modules/cml-ui/scroller/scroller.cml') + console.log(result) + result.forEach(item=>{ + if (item.tagName === 'scroller') { + expect(item.filePath).to.be.equal(expectPath); + expect(item.isNative).to.be.equal(false); + } + }) + }) + + it('../npm/', function() { + let originObj = { + scroller: './../npm/cml-ui/scroller/scroller' + } + let loaderContext = { + resourcePath: path.join(__dirname, './project/src/pages/page1.cml') + } + + let context = path.join(__dirname, './project'); + let result = loaderMethods.prepareParseUsingComponents({ + loaderContext, + context, + originObj, + cmlType: 'wx' + }); + + let expectPath = path.join(__dirname, './project/node_modules/cml-ui/scroller/scroller.cml') + result.forEach(item=>{ + if (item.tagName === 'scroller') { + expect(item.filePath).to.be.equal(expectPath); + expect(item.isNative).to.be.equal(false); + } + }) + }) +}) + + diff --git a/packages/chameleon-loader/test/src/project/src/components/com1.cml b/packages/chameleon-loader/test/src/project/src/components/com1.cml new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/chameleon-loader/test/src/project/src/pages/page1.cml b/packages/chameleon-loader/test/src/project/src/pages/page1.cml new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/chameleon-tool-utils/src/index.js b/packages/chameleon-tool-utils/src/index.js index 5671f5fa5c0a140abef2e35ba1b47ce9fbc529df..bbd7aab24ac8fd24aceb65acc55abec02d5acd59 100644 --- a/packages/chameleon-tool-utils/src/index.js +++ b/packages/chameleon-tool-utils/src/index.js @@ -732,7 +732,7 @@ _.findInterfaceFile = function(context, cmlFilePath, comPath) { _.npmComponentRefPath = function (componentAbsolutePath, context) { let refUrl = ''; refUrl = path.relative(context, componentAbsolutePath); - refUrl = refUrl.replace('node_modules', 'npm'); + refUrl = refUrl.replace(/node_modules/g, 'npm'); refUrl = _.handleWinPath(refUrl); if (refUrl[0] !== '/') { refUrl = '/' + refUrl @@ -893,7 +893,7 @@ _.getEntryPath = function (filePath, context) { let entryName; if (~filePath.indexOf('node_modules')) { entryName = path.relative(root, filePath); - entryName = entryName.replace('node_modules', 'npm'); + entryName = entryName.replace(/node_modules/g, 'npm'); } else { entryName = path.relative(projectPath, filePath); }